lee*_*777 3 c++ multithreading thread-safety compiler-optimization
在今天的代码审查中,我偶然发现了以下一些代码(稍微修改后发布):
while (!initialized)
{
// The thread can start before the constructor has finished initializing the object.
// Can lead to strange behavior.
continue;
}
Run Code Online (Sandbox Code Playgroud)
这是在新线程中运行的前几行代码.在另一个线程中,一旦初始化完成,它就会设置initialized为true.
我知道优化器可以将其变成无限循环,但是避免这种情况的最佳方法是什么?
volatile- 被认为有害isInitialized()函数而不是直接使用变量 - 这会保证内存障碍吗?如果宣布该功能inline怎么办?还有其他选择吗?
编辑:
应该早点提到这一点,但这是需要在Windows,Linux,Solaris等上运行的可移植代码.我们主要使用Boost.Thread作为我们的便携式线程库.
调用一个函数根本没有用; 即使没有声明一个函数inline,它的主体仍然可以被内联(除非是极端的东西,比如将你的isInitialized()函数放在另一个库中并动态链接它).
想到两个选项:
声明initialized为原子标志(在C++ 0x中,您可以使用std::atomic_flag;否则,您将需要查阅线程库的文档以了解如何执行此操作)
使用信号量; 在另一个线程中获取它并在此线程中等待它.