C++多线程 condition_variabe条件变量

本文详细介绍了条件变量在C++中的使用,包括其在头文件<condition_variable>中的定义,5个关键函数的作用及原理,以及如何在多线程环境中实现线程间同步。通过实例展示了std::condition_variable和std::condition_variable_any的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、头文件

#include <condition_variable>

2、作用

用于线程间的同步阿

3、条件变量的5个函数

wait 阻塞自己,等待唤醒
wait_for 阻塞自己,等待被唤醒,等待一段时间
wait_until 阻塞自己,等待唤醒,等待到某个时间点
notify_one 唤醒一个等待在这个条件变量上的线程(随机)
notify_all 唤醒所有等待在这个条件变量上的线程

4、原理

1、当std::condition_variable对象的某个wait函数被调用的时候,它使用std::unique_lock(通过 std::mutex)来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同std::condition_variable对象上调用了notiry函数来唤醒当前线程
2、在线程被阻塞时,该函数会自动调用lck.unlock()释放锁,使得其他被阻塞在锁竞争上的线程得以继续执行。另外,一旦当前线程获得通知(notified,通常是另外某个线程调用notify_*唤醒了当前线程),wait()函数也是自动调用lock()。

5、类似类说明

condition_variable_any:和std::condition_variable几乎完全一样。只不过std::condition_variable_any的wait函数可以接受任何lockable参数,而std::condition_variable只能接受std::unique_lock类型的参数

6、举例

#include <thread>    
#include <mutex>   
#include <condition_variable>   
#include<iostream>
using namespace  std;
using namespace  std::this_thread;
using namespace  std::chrono;

condition_variable   cv;//仅支持unique_lock<mutex> 作为wait的参数
condition_variable_any   cv2;//接受任何 lockable参数作为wait的参数
mutex  m;


void  ThreadFun(int id)
{ 
	unique_lock<mutex>  lck(m); 
	//cv.wait(lck);//等待被唤醒 

	cv2.wait(lck);

	cout << "线程ID:" << id << "执行!" << endl;

}

int main()
{
	thread  t1(ThreadFun, 1);
	thread  t2(ThreadFun, 2);
	thread  t3(ThreadFun, 3);
	
	cout << "3秒后唤醒:" << endl;

	sleep_for(seconds(3));//3秒之后唤醒所有线程

	//cv.notify_all();//唤醒所有 

	//cv.notify_one();
	//cv.notify_one();

	cv2.notify_all();

	t1.join();
	t2.join();
	t3.join();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值