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

目录

condition_variable

notify_one的使用

notify_all的使用


condition_variable

主要的3个步骤:

1.调用wait函数阻塞线程

2.unique_lock 加锁线程

3.notify_one,notify_all唤醒线程

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;
}

猜你喜欢

转载自blog.csdn.net/q244645787/article/details/131582819