C++ 11线程死锁

Mar*_*ese 0 multithreading deadlock c++11

我已经为线程编写了一个简单的同步,但它死锁,我不知道如何以一种聪明的方式修复它.

我有一个

std::atomic<int> count_;
Run Code Online (Sandbox Code Playgroud)

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

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

哪里

size_
Run Code Online (Sandbox Code Playgroud)

是启动的线程数(在我的情况下为2).这个同步代码在线程内运行了几次(在我的例子中为3).

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

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

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

Com*_*sMS 5

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

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