C++多线程学习(八、条件变量:condition_variable)

这篇具有很好参考价值的文章主要介绍了C++多线程学习(八、条件变量:condition_variable)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

condition_variable

notify_one的使用

notify_all的使用


condition_variable

主要的3个步骤:

1.调用wait函数阻塞线程

2.unique_lock 加锁线程

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包