c++多线程之条件变量

本文深入探讨了C++中的条件变量`condition_variable`,结合互斥量工作原理,详细解析`wait()`和`notify_one()`函数的使用。`wait()`函数依赖于lambda表达式判断是否返回,而`notify_one()`则可能面临虚假唤醒的问题。通过示例阐述了如何避免数据竞争,以及有效利用`notify_all()`唤醒多个等待线程。
摘要由CSDN通过智能技术生成

1.条件变量condition_variable、wait()、notify_one()(通知一个线程)

1.1condition_variable实际上是一个类,是一个和条件相关的一个类,等待一个条件达成,这个类需要和互斥量来配合工作,用的时候我们要生成这个类的对象。

1.2.1wait()函数用于等待一个消息,他的第二个参数lambda表达式返回值是true,那wait()直接返回,否则wait()将解锁互斥量,并堵塞到本行,堵塞到其他某个线程调用notify_one()成员函数为止。如果wait()没有第二个参数,那么结果和lambda表达式返回false一样。

1.2.2当线程调用notify_one()唤醒wait()(原先堵塞状态)时,wait()恢复后,不断地尝试重新获取互斥量锁,如果获取不到,那么流程卡在wait这里等着获取,如果获取到了锁,那么就判断wait()是都有第二个参数,如果有,那么判断lambda表达式值的真假,如果为true,则wait返回,流程走下去(此时互斥锁被锁着),如果为false那么wait对互斥量解锁,继续睡眠堵塞状态。如果没有结果和true的结果是一致的。

注:notify_one的效果不一定能快速唤醒wait(),如果另外一个线程不是卡在wait处等待唤醒,在做其他事务是,唤醒是无效的。inMsgRecvQueue()与outMsgRecvQueue()调用的时候两个线程对锁的竞争,会出现inMsgRecvQueue()调用更多,导致插入的数据过多。通过lambda表达式判断取数据时是否有数据,可以避免虚假唤醒。

lambda表达式的使用参考https://www.cnblogs.com/DswCnblog/p/5629165.html

  1 #include<iostream>                                                                
  2 #include<thread>                                                                  
  3 #include<list>                                                                    
  4 #include<mutex>                                                                   
  5 #include<condition_variable>                                                      
  6                                                                                   
  7 using namespace std;                                                              
  8                                                                                   
  9 class A{                                                                          
 10 public:                                                                           
 11 //把收到的消息入到一个队列的线程                                                  
 12 void inMsgRecvQueue(){                  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值