3

我听说 C++ 不提供对多线程的本机支持。我假设多线程 C++ 应用程序依赖于多线程的托管代码;也就是说,例如,一个 Visual C++ 应用程序使用 MFC 或 .NET 或类似的东西来提供多线程功能。我进一步假设这些托管代码功能中的一些或全部对于非托管应用程序是不可用的。但是我已经阅读了有关非托管多线程应用程序的信息。这怎么可能?我的哪个假设是错误的?

4

8 回答 8

12

为多线程提供支持完全取决于操作系统。在 Windows 上,必要的功能可通过 Win32 API 获得。诸如MFC之类的框架提供了对低级线程函数的封装以简化事情,而 .NET/CLR 当然有自己的托管接口来访问 Win32 多线程功能。

本文提供了一个很好的解释(C++ 中的多线程)。

为什么 C++ 不包含对多线程的内置支持?

C++ 不包含对多线程应用程序的任何内置支持。相反,它完全依赖于操作系统来提供此功能。鉴于 Java 和 C# 都提供了对多线程的内置支持,很自然地会问为什么 C++ 也不是这种情况。答案是效率、控制以及应用 C++ 的应用范围。让我们逐一检查。

由于不支持多线程,C++ 不会尝试定义“一刀切”的解决方案。相反,C++ 允许您直接利用操作系统提供的多线程特性。这种方法意味着您的程序可以以执行环境支持的最有效方式进行多线程处理。由于许多多任务环境为多线程提供了丰富的支持,因此能够访问该支持对于创建高性能、多线程程序至关重要。

于 2009-05-11T00:22:17.917 回答
4

C++ 中的多线程不需要托管代码。

与 C++ 不提供对显示图形或发出声音或从鼠标读取输入的本机支持非常相似,所使用的操作系统将提供 C++ API 来利用这些功能。

这不是 C++ 无法做到的问题。它还没有被写入 C++ 标准。

于 2009-05-11T02:08:15.950 回答
3

你的一些假设并不完全正确。操作系统(我说的是win32,因为你提到了.NET)提供了对线程的支持。有很多好的线程库。它建立在 C++ 中的操作系统功能之上,使多线程“更容易”:)——例如 pthreads 。这是 MSDN 上的更多内容

于 2009-05-11T00:24:16.760 回答
2

编程语言 C++ 的 ISO 标准既没有定义也没有禁止多线程。如果需要,允许实现提供扩展。如果程序愿意,可以使用实现扩展,然后程序将只在提供这些扩展的系统上运行。

相比之下,编程语言 C++ 的 ISO 标准既没有定义也没有禁止使用鼠标。允许程序使用实现扩展,然后它只能在提供这些扩展的系统上运行。作为另一个比较,C++ 的 ISO 标准既没有定义也没有禁止 UTF-8,因此您的程序可以依赖于 Latin-1,然后您的程序将只能在提供 Latin-1 的系统上运行。

于 2009-05-11T02:26:14.343 回答
1

本机 C++ 不提供“内置”多线程支持,仅仅是因为它不是有意或实际上不需要的。您的误解是这是一个错误,而实际上它是语言的优势。通过“无视”多线程,C++ 与您的代码将在其上编译和运行的操作系统提供的 MT 支持无缝集成,从而提供比它自己的“MT 包袱”更多的灵活性和效率。您提到 MFC 和 .NET 作为示例 - 请注意,这些库/包装器只是基本 Win32 API 的一层。按预期使用 C++ 将为您提供可在任何操作系统上多线程运行的高效代码,只要您将逻辑与特定于操作系统的 MT API 调用(即线程创建等)分开,以便在操作系统之间移植

于 2009-05-11T07:46:54.213 回答
0

与定义语言结构和 JVM 规范的 Java 不同,C++ 标准忽略了线程(C 也是如此)。就这些语言而言,任何与线程相关的内容都包含对操作系统功能的函数调用。为多线程编译的库只是简单地理解相同的调用,但从语言的角度来看,它们是普通的旧代码。

于 2009-05-11T02:40:06.803 回答
0

下一个 C++ 标准(名为 c++0x)将支持多线程。将包括原子操作。

于 2009-05-11T14:03:01.950 回答
0

我认为您误解了“托管”代码的定义。“托管”代码是 Microsoft 特定的术语,意思是使用 .NET 框架的代码,因此受 .NET 各个方面的约束。“非托管”代码是指在其外部运行且不通过 .NET 层运行的代码。MFC 代码是“非托管”的;对于无处不在的 Win32 API(它甚至不是 Windows 上可用的最低级别的 API),它只是一个非常糟糕的包装器。

.NET 库(包括多线程)在某种程度上几乎都是传统“非托管”应用程序使用的更基本系统 API 的接口。一般来说,“托管”代码没有可用的功能,无法通过足够的努力在“非托管”代码中复制,尽管反过来是不正确的(如果您想了解更多信息,这称为抽象惩罚)。虽然在“托管”代码中可能更容易做到,但这只是因为在某个地方,一些“非托管”代码或多或少地为你做这件事。在线程 API 的情况下,它又是操作系统内核的接口,它本身访问处理器的功能以允许进程同时在多个位置运行(如果使用多个内核;如果不是,那么它)

C++ 标准目前没有提供线程的定义(即将到来的 C++1x 标准提供)。有许多不同的线程库可用,包括 Win32 和 MFC 提供的、POSIX 系统上的 pthreads 库和 Boost.Thread,它将使用平台的本地线程库。

于 2009-05-11T07:54:30.847 回答