为什么线程从未作为C ++标准的一部分包含在内?

时间:2010-10-18 13:48:52

标签: c++ multithreading standards

为什么线程从未作为C ++标准的一部分包含在内?首次创建C ++标准时它们不存在吗?

8 个答案:

答案 0 :(得分:12)

当前的标准是从1998年开始的。有不同的线程实现,并且没有12年后使用线程的经验体验。如果C ++有一个标准化的线程库,它可能在一些常见的线程实现上运行不佳,并且很可能在将来难以适应。

现在已经十二年了,而且我们对线程的使用方式了解得更多,而且更广泛的使用对标准化它们产生了更多的兴趣,因此即将推出的C ++标准(我希望将在2011年正式发布)将会有一个关于库中线程的部分。

答案 1 :(得分:12)

我认为主要原因是

  • 在语言中指定线程行为需要大量的工作和理解,当时没有人可以使用
  • 没有人对一个好的线程API有很好的想法,并且没有一个现有的库似乎足以作为进一步工作的基础
  • 标准化委员会淹没了足够的其他工作(比如将STL纳入标准库)
  • 那个标准已经迟到了;第一个版本花了十多年的时间才出现,由于“最后一分钟的变化”(std::auto_ptr,STL)而导致相当多的延迟,我认为主要的感觉是比早期出现更好的东西。继续等待不断延迟的完美标准;我想当时大多数人都不认为下一个版本需要很长时间才能完成

标准批准后,图书馆工作组的成员创建了boost作为库的测试平台,这些库在std lib中是可取的,但是没有足够的时间来制作最终版本。在那里,完成了向C ++添加线程支持所需的大部分工作(即发明了一个好的线程库)。

答案 2 :(得分:3)

当C ++在20世纪90年代被标准化时,线程确实存在。但是,Windows和Posix具有非常不同的线程API。从标准语言库中设计一个您想要的质量库,提供您需要的所有线程原语并很好地映射到流行的API(和其他API),需要付出很大的努力。将其纳入初始标准将要求延迟标准化,可能需要多年,或者包括可能存在重大缺陷的规范。

这项工作在过去十年左右(最初作为Boost.Thread库)完成,除了语言级功能之外,还将作为标准的下一版本中的标准线程支持库包含在内。作为线程本地存储。

答案 3 :(得分:1)

创建线程类涉及很多工作,C ++ 0x通过添加线程,互斥和原子库在很大程度上解决了这个问题,但是很多人花了很多工作。

Orginazationally,请记住,C ++是一种非常大的语言,由于语言的复杂性以及依赖它的代码和行业的数量,变化发生得非常缓慢;因此,需要很长时间才能批准对标准的修改。

此外,线程和同步通常是操作系统提供的功能,因此任何添加都需要与常见实现兼容,并且无需对平台进行大量更改(或者没有人能够实现标准)。

从技术上讲,仅添加一个线程API是不够的,C ++也缺少一个内聚的内存模型,即变量如何跨线程交互,我们如何允许在代码中表达各种各样的内存模型简洁(和执行)。我们大多数人都很幸运能够主要使用基于x86的单线程软件,这种软件具有非常宽容的内存模型,但是其他硬件从内存模型的角度来看并不宽容,性能损失可能非常严厉。

该库通过提供具有宽容默认值和显式控制的原子变量来解决内存模型问题。

该库通过提供同步类为便携式线程提供了另一个关键功能。

最后添加了如果你还没有阅读工作组网站上的历史记录,这很有意思,但只是替换CreateThread,QueueUserWorkItem或pthread调用是一个线程对象还不够。线程生存期,状态管理和线程本地存储都必须经过考虑。

所有这些都需要很长时间才能做到正确,正如其他人提到的那样,大部分时间都在提升,以确保重大问题得到解决,并且在将其纳入新标准之前具有凝聚力。

答案 4 :(得分:0)

因为作者不想强迫实施者采取特定的行为。

答案 5 :(得分:0)

线程是操作系统的东西,因此它们实际上不是编程语言的功能,因为它们是系统提供的库。例如,POSIX线程可以在C ++中使用,但实际上并不是它的“部分”。

答案 6 :(得分:0)

12年前标准委员会面临的挑战之一是并行硬件的差异。各种高性能计算体系结构之间的一个关键区别特征是允许并行计算的方式,并且这些模型中只有一个与posix线程抽象SMP非常相似。

如果将这种情况与专门针对此类硬件的Fortran语言所面临的情况进行比较,您会发现每个供应商都提供了一个Fortran编译器,它们已经扩展以支持硬件提供的特殊并行计算功能。

通过比较典型的x86 / x64白盒计算节点(通常最多可包含4个插槽),这可以看作是今天相关的,它可以转换为具有单个共享内存的24个内核到具有多个nVidia或AMD的游戏PC GPU的。两者都能够惊人的计算吞吐量,但是为了充分利用它们需要一种非常不同的编程风格。事实上,根据特定算法的确切性质,不同的工作负载在一个体系结构上的效果会明显优于另一个体系结构。

话虽如此,12年前,标准委员会可能无法确定如何解决这些问题。然而,现在答案更简单了。除了SMP硬件之外,C ++并不针对任何东西;这些由其他语言和工具链提供,例如OpenCL或VHDL。

答案 7 :(得分:-1)

因为它们依赖于操作系统。 I.E. unix / linux / macosx使用pthread API,Windows使用自己的API,等等......

它们本可以包含在libstdc++中,但我想在通用API中包含所有当前和未来的线程功能并不容易。同样,数据库访问也不包含在libstdc++中。