C++ condition_variable用法

本文介绍了condition_variable的使用方法,包括线程的等待和唤醒功能,并通过示例代码展示了如何利用条件变量实现线程间的同步。此外还提供了一个简单的信号量实现方式。

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

概述

condition_variable类似于信号量机制,实现了线程的等待和唤醒。

函数接口:
wait() :阻塞等待的同时释放锁(原子操作),还可以添加阻塞判断函数,详见代码

notify_all() : 唤醒所有阻塞等待的线程

notify_one(): 唤醒某一个等待的线程

代码

#include<iostream>  
#include<thread>  
#include<mutex>  
#include<condition_variable>  
#include<chrono>
using namespace std;
mutex m;
condition_variable cond;
int LOOP = 10;
int flag = 0;

void fun(int id) {
	for (int i = 0; i < LOOP; i++) {
		unique_lock<mutex> lk(m);	//加锁
		//写法1,while循环比较,多次唤醒时,只要不满足条件就阻塞,if只判断一次会出错
		/*while (id != flag)
			cond.wait(lk);*/

			//写法2,实现原理和上面一样 ,id != flag时会阻塞,唤醒时继续判断,id == flag才会唤醒成功
		cond.wait(lk, [=]() {
			return id == flag;
			});
		cout << (char)('A' + id) << " ";
		flag = (flag + 1) % 3;
		cond.notify_all();
	}
}
int main() {
	thread A(fun, 0);
	thread B(fun, 1);
	thread C(fun, 2);

	A.join();
	B.join();
	C.join();
	cout << endl;
	cout << "main end" << endl;
	return 0;
}


测试结果:
在这里插入图片描述

semaphore源码

#pragma once
#include<mutex>
#include<condition_variable>
class semaphore {
public:
	semaphore(long count = 0) :count(count) {}
	void wait() {
		std::unique_lock<std::mutex>lock(mx);
		cond.wait(lock, [&]() {return count > 0; });
		--count;
	}
	void signal() {
		std::unique_lock<std::mutex>lock(mx);
		++count;
		cond.notify_one();
	}

private:
	std::mutex mx;
	std::condition_variable cond;
	long count;
};




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值