【发布时间】:2018-09-08 18:16:31
【问题描述】:
我有这个多线程练习要解决。我必须创建一个类,其中 5 个线程相互等待,当第五个线程到达时,它们都被解锁。 我想使用互斥锁和条件变量,但我不知道我是否很好地使用它们。 我使用 add() 方法创建了一个类,该方法将 variableX 增加 1,创建了一个接收函数 print() 和稍后 join() 它的线程。函数 print() 检查变量 X 是否为 5 的小数,如果是这样,则条件变量等待,否则条件变量使用 notify_all() 函数唤醒所有线程。编译器给出 0 错误,但通过调试,我看到程序陷入死锁。这是一个sn-p
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
using namespace std;
void print(mutex & mtx, condition_variable & convar, int x) {
if (x < 5){
unique_lock<mutex> lock(mtx); //acquire and lock the mutex
convar.wait(lock); //unlock mutex and wait
}
else {
convar.notify_all();
cout << "asdasd" << endl;
}
}
class foo {
public:
void add() {
this->x = x + 1;
thread t1(print, ref(mtx), ref(cv), x);
t1.join();
}
private:
mutex mtx;
condition_variable cv;
int x;
};
int main() {
foo f;
f.add();
f.add();
f.add();
f.add();
f.add();
}
【问题讨论】:
-
this->x = x + 1;有点奇怪。x最初是如何获得价值的? -
问题是什么?
标签: c++ multithreading mutex condition-variable