Jos*_*vin 8 c++ multithreading standards-compliance static-initialization c++11
在某些时候我记得读过在main()的第一行之前无法安全地创建线程,因为编译器会插入特殊代码来使线程工作在静态初始化时运行.因此,如果您有一个在构造时创建线程的全局对象,您的程序可能会崩溃.但是现在我找不到原始文章了,我很好奇这是一个多么强烈的限制 - 标准是否严格如此?大多数编译器都是如此吗?它会在C++ 0x中保持真实吗?符合标准的编译器是否有可能使静态初始化本身成为多线程?(例如,检测到两个全局对象不会相互接触,并在不同的线程上初始化它们以加速程序启动)
编辑:为了澄清,我试图至少了解实现是否真的在这方面有显着差异,或者它是否是伪标准的东西.例如,从技术上讲,该标准允许改组属于不同访问说明符(public/protected/etc.)的成员的布局.但我知道的编译器实际上没有这样做.
你所说的并不是严格意义上的语言,而是C运行时库(CRT).
首先,如果您使用本机调用(例如CreateThread()在Windows上)创建线程,那么您可以在任何您喜欢的地方执行此操作,因为它直接进入操作系统而无需CRT的干预.
您通常拥有的另一个选择是使用_beginthread()哪个是CRT的一部分.使用_beginthread()诸如具有线程安全的errno 有一些优点.在这里阅读更多相关信息.如果您要使用创建线程,_beginthread()则可能会出现一些问题,因为_beginthread()可能无法进行初始化.
这涉及一个更普遍的问题,即之前main()和之后的确切发生的事情.基本上你有程序的入口点功能,它可以处理以前需要main()用Visual Studio 发生的所有事情,你可以实际查看CRT中的这段代码,并自己找出那里究竟发生了什么.获得该代码的最简单方法是在代码中停止断点并查看之前的堆栈帧main()
| 归档时间: |
|
| 查看次数: |
378 次 |
| 最近记录: |