【发布时间】:2010-11-29 12:43:47
【问题描述】:
在某些时候,我记得读到在 main() 的第一行之前无法安全地创建线程,因为编译器会插入特殊代码以使线程在静态初始化期间运行。因此,如果您有一个在构造时创建线程的全局对象,您的程序可能会崩溃。但是现在我找不到原始文章了,我很好奇这是一个多么严格的限制——按标准严格来说是真的吗?大多数编译器都是这样吗?在 C++0x 中它会保持不变吗?符合标准的编译器是否可以使静态初始化本身成为多线程的? (例如检测两个全局对象不相互接触,并在不同的线程上初始化它们以加速程序启动)
编辑:为了澄清,我试图至少了解实现在这方面是否真的有很大差异,或者它是否是伪标准的东西。例如,从技术上讲,该标准允许改组属于不同访问说明符(公共/受保护/等)的成员的布局。但是我所知道的编译器实际上没有这样做。
【问题讨论】:
-
“按照标准严格来说是真的吗”——C++03 标准对线程的主题没有什么可说的。就当前行为而言,需要查看的地方是 POSIX(这当然是 a 标准,只是不是 the 标准)、MSDN、Boost 或其他特定于实现的您使用的编译器、平台和线程 API 的文档。
标签: c++ multithreading c++11 standards-compliance static-initialization