如何避免线程+优化器==无限循环?

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)

这是在新线程中运行的前几行代码.在另一个线程中,一旦初始化完成,它就会设置initializedtrue.

我知道优化器可以将其变成无限循环,但是避免这种情况的最佳方法是什么?

  • volatile- 被认为有害
  • 调用isInitialized()函数而不是直接使用变量 - 这会保证内存障碍吗?如果宣布该功能inline怎么办?

还有其他选择吗?

编辑:

应该早点提到这一点,但这是需要在Windows,Linux,Solaris等上运行的可移植代码.我们主要使用Boost.Thread作为我们的便携式线程库.

Jam*_*lis 5

调用一个函数根本没有用; 即使没有声明一个函数inline,它的主体仍然可以被内联(除非是极端的东西,比如将你的isInitialized()函数放在另一个库中并动态链接它).

想到两个选项:

  • 声明initialized为原子标志(在C++ 0x中,您可以使用std::atomic_flag;否则,您将需要查阅线程库的文档以了解如何执行此操作)

  • 使用信号量; 在另一个线程中获取它并在此线程中等待它.