练习多线程
Exercise of multithreading
我有这个多线程练习要解决。我必须创建一个类,其中 5 个线程相互等待,当第五个线程到达时,它们全部解锁。 我想使用互斥锁和条件变量,但我不知道我是否很好地使用了它们。 我用 add(( 方法创建了一个类,它将变量 X 递增 1,创建一个接收函数 print(( 的线程,然后 join(( 它。函数 print(( 检查变量 X 是否是 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();
}
你的函数
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 << "asdasdn";
}
}
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();
}
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 练习多线程