我有这个多线程练习来解决。我必须创建一个类,其中5个线程互相等待,而当第5个线程到达时,它们都被解锁。 我想使用互斥量和条件变量,但是我不知道我是否使用得很好。 我使用方法add()创建一个类,该类将variableX加1,创建一个线程,该线程接收函数print(),然后将其加入()。函数print()检查variableX是否小于5,是否类似于条件变量等待,否则条件变量使用notify_all()函数唤醒所有线程。编译器给出0错误,但是通过调试,我看到程序陷入了死锁。这是一个片段
#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();
}
答案 0 :(得分:2)
您的功能
void add() { this->x = x + 1; thread t1(print, ref(mtx), ref(cv), x); t1.join(); }
创建一个线程,然后等待(join()
)直到线程结束。由于您的线程功能
void print(mutex & mtx, condition_variable & convar, int x) { if (x < 5){ unique_lock<mutex> lock(mtx); convar.wait(lock); // waits if x < 5 } // ...
和x
是可以推测的(您确实没有初始化它)<5您有死锁。
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <condition_variable>
using namespace std;
void print(mutex & mtx, condition_variable & convar, int x)
{
if (x < 5) {
unique_lock<mutex> lock{ mtx };
convar.wait(lock);
} else {
convar.notify_all();
cout << "asdasd\n";
}
}
class foo {
private:
mutex mtx;
condition_variable cv;
int x{ 0 };
std::vector<thread> threads;
public:
void add() {
++x;
threads.push_back(thread(print, ref(mtx), ref(cv), x));
}
~foo() {
for (auto &t : threads)
t.join();
}
};
int main() {
foo f;
f.add();
f.add();
f.add();
f.add();
f.add();
}