目录
condition_variable
notify_one的使用
notify_all的使用
condition_variable
主要的3个步骤:
1.调用wait函数阻塞线程
2.unique_lock 加锁线程文章来源:https://www.toymoban.com/news/detail-533593.html
3.notify_one,notify_all唤醒线程文章来源地址https://www.toymoban.com/news/detail-533593.html
notify_one的使用
#include<iostream>
#include<thread>
#include<mutex>
#include<condition_variable>
using namespace std;
condition_variable ConVar;
mutex mtx_ConVar;
int i = 0; //描述唤醒条件
bool Done = false; //充当开关
void waits()
{
unique_lock<mutex> unique(mtx_ConVar);//加锁
cout << "等待中....." << endl;
ConVar.wait(unique, []() {return i == 1; });//用lambda表达式:当i==1的时候,不赌赛
cout <<"等待结束" << endl;
Done = true;//表示已执行完
}
void SendSign()//发送信号
{
this_thread::sleep_for(1s);
cout << "不做条件变量的唤醒操作" << endl;
ConVar.notify_one();
//上面这里失败了,线程仍然在等待中
unique_lock<mutex> unique(mtx_ConVar);
i = 1;
while (!Done)
{
cout << "条件变量满足的唤醒操作" << endl;
unique.unlock();//手动解锁
ConVar.notify_one();
this_thread::sleep_for(1s);
unique.lock();
}
}
int main()
{
thread t1(waits), t2(SendSign);
//thread t3(waits);//这里做两个等待的线程t1和t3,当存在多个阻塞线程的时候,用notify_one--->有一定几率阻塞线程出现问题,程序是不稳定的
t1.join();
//t3.join();
t2.join();
return 0;
}
notify_all的使用
#include<iostream>
#include<thread>
#include<mutex>
#include<condition_variable>
using namespace std;
condition_variable ConVar;
mutex mtx_ConVar;
int i = 0; //描述唤醒条件
bool Done = false; //充当开关
void waits(int id)
{
unique_lock<mutex> unique(mtx_ConVar);//加锁
cout<<"线程:"<<id << "等待中....." << endl;
ConVar.wait(unique, []() {return i == 1; });//用lambda表达式:当i==1的时候,不赌赛
cout <<id<<"等待结束" << endl;
Done = true;//表示已执行完
}
void SendSign()//发送信号
{
this_thread::sleep_for(1s);
{
unique_lock<mutex> unique(mtx_ConVar);
cout << "无条件变量改变的唤醒操作" << endl;
ConVar.notify_all();
}
this_thread::sleep_for(1s);
{
unique_lock<mutex> unique(mtx_ConVar);
cout << "有条件变量改变的唤醒操作" << endl;
i = 1;
ConVar.notify_all();
}
}
int main()
{
thread t1(waits,1), t2(waits, 2), t3(waits, 3), t4(waits, 4);
thread S1(SendSign);//唤醒的顺序是不一定的
t1.join();
t2.join();
t3.join();
t4.join();
S1.join();
return 0;
}
到了这里,关于C++多线程学习(八、条件变量:condition_variable)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!