C++条件变量condition_variable使用方法

一、条件变量概述条件变量可以实现一个线程唤醒一个或多个其他等待中的线程,实现线程间的同步。生产者消费者模型就可以用条件变量来实现。二、条件变量示例源码#pragma once#include <mutex>#include <condition_variable>#include <chrono>#include <queue>us...
摘要由CSDN通过智能技术生成
一、条件变量概述

条件变量可以实现一个线程唤醒一个或多个其他等待中的线程,实现线程间的同步。生产者消费者模型就可以用条件变量来实现。

二、条件变量示例
源码
#pragma once
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <queue>
using namespace std;
class ConditionVariableTest
{
   
private:
	static mutex _queueMutex;
	static queue<int> _queue;
	static condition_variable _queueConditionVar;
public:
	void DoTest()
	{
   
		thread providerThread(Provider);
		int consumerNum 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
condition_variableC++11中的一个同步原语,常和mutex搭配使用,用于阻塞一个线程或同时阻止多个线程,直到另一个线程修改共享变量并通知condition_variable。它可以防止多线程场景下,共享变量混乱。理解条件变量需要先理解三个概念:锁、wait等待和notify通知。 condition_variable使用方法如下: 1.定义condition_variable对象和mutex对象 ```c++ std::condition_variable cv; std::mutex cv_m; ``` 2.资源修改线程步骤 ```c++ std::unique_lock<std::mutex> lk(cv_m); // 修改共享变量 cv.notify_one(); // 通知等待的线程 ``` 3.资源等待线程步骤 ```c++ std::unique_lock<std::mutex> lk(cv_m); cv.wait(lk, []{return true/false;}); // 等待条件变量 ``` 其中,wait函数会自动释放锁,等待条件变量被通知后重新获取锁。 4.代码示例 4.1 无需notify场景 ```c++ #include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; std::condition_variable cv; bool ready = false; void print_id(int id) { std::unique_lock<std::mutex> lck(mtx); while (!ready) cv.wait(lck); std::cout << "thread " << id << '\n'; } void go() { std::unique_lock<std::mutex> lck(mtx); ready = true; cv.notify_all(); } int main() { std::thread threads[10]; for (int i = 0; i < 10; ++i) threads[i] = std::thread(print_id, i); std::cout << "10 threads ready to race...\n"; go(); for (auto& th : threads) th.join(); return 0; } ``` 4.2 正常应用场景1 ```c++ #include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; std::condition_variable cv; bool data_ready = false; void consumer() { std::unique_lock<std::mutex> lck(mtx); cv.wait(lck, []{return data_ready;}); std::cout << "Consumer: data is ready\n"; } void producer() { std::unique_lock<std::mutex> lck(mtx); data_ready = true; cv.notify_one(); } int main() { std::thread t1(consumer); std::thread t2(producer); t1.join(); t2.join(); return 0; } ``` 4.3 正常应用场景2 ```c++ #include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; std::condition_variable cv; bool data_ready = false; void consumer() { std::unique_lock<std::mutex> lck(mtx); cv.wait(lck, []{return data_ready;}); std::cout << "Consumer: data is ready\n"; data_ready = false; } void producer() { std::unique_lock<std::mutex> lck(mtx); data_ready = true; cv.notify_one(); } int main() { std::thread t1(consumer); std::thread t2(producer); t1.join(); t2.join(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值