我已经为线程编写了一个简单的同步,但是它已经陷入僵局,我不知道如何以一种聪明的方式修复它。
我有一个
std::atomic<int> count_;
在我的main中声明(它被初始化等于0)并且每个线程运行此代码
count_++;
while(!(count_%size_==0)); // wait until all the threads have reached this point
,其中
size_
是启动的线程数(在我的情况下为2)。此同步代码在线程内运行多次(在我的情况下为3)。
有时它工作正常,但有时它会死锁。
我认为有时候,在第一次调用此屏障时,线程会再次递增count_,之后另一个线程会测试导致死锁的情况。
如何在不设置任何延迟功能的情况下解决此问题?有没有更好的方法在线程内创建检查点?
答案 0 :(得分:5)
您的代码展示的竞赛如下:一旦最后一个线程到达屏障,所有线程都可以继续。但是,只要第一个线程再次到达屏障 ,继续的条件就不再成立。任何没有通过该点离开障碍的线程都将被卡住。
这个问题的一个简单解决方案是使用C ++ 11的condition_variable
。我不久前发布了一个示例实现作为this answer的一部分。