在今天的代码审查中,我偶然发现了以下代码(为发布而稍作修改):
while (!initialized)
{
// The thread can start before the constructor has finished initializing the object.
// Can lead to strange behavior.
continue;
}
这是在新线程中运行的前几行代码。在另一个线程中,一旦初始化完成,它就会设置initialized
为true
.
我知道优化器可以把它变成一个无限循环,但是避免这种情况的最好方法是什么?
volatile
-被认为是有害的- 调用
isInitialized()
函数而不是直接使用变量 - 这会保证内存屏障吗?如果函数被声明了inline
怎么办?
还有其他选择吗?
编辑:
应该早点提到这一点,但这是需要在 Windows、Linux、Solaris 等上运行的可移植代码。我们主要使用Boost.Thread作为我们的可移植线程库。