C ++ 11线程死锁

时间:2014-08-11 12:53:06

标签: multithreading c++11 deadlock

我已经为线程编写了一个简单的同步,但是它已经陷入僵局,我不知道如何以一种聪明的方式修复它。

我有一个

std::atomic<int> count_;

在我的main中声明(它被初始化等于0)并且每个线程运行此代码

count_++;
while(!(count_%size_==0)); // wait until all the threads have reached this point

,其中

size_

是启动的线程数(在我的情况下为2)。此同步代码在线程内运行多次(在我的情况下为3)。

有时它工作正常,但有时它会死锁。

我认为有时候,在第一次调用此屏障时,线程会再次递增count_,之后另一个线程会测试导致死锁的情况。

如何在不设置任何延迟功能的情况下解决此问题?有没有更好的方法在线程内创建检查点?

1 个答案:

答案 0 :(得分:5)

您的代码展示的竞赛如下:一旦最后一个线程到达屏障,所有线程都可以继续。但是,只要第一个线程再次到达屏障 ,继续的条件就不再成立。任何没有通过该点离开障碍的线程都将被卡住。

这个问题的一个简单解决方案是使用C ++ 11的condition_variable。我不久前发布了一个示例实现作为this answer的一部分。