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(){                  
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你想了解关于 C++ 条件变量多线程中的使用。 在多线程中,条件变量通常用于线程间的同步,它可以让一个线程等待另一个线程的特定事件发生。当这个特定事件发生时,另一个线程可以通过条件变量来通知等待的线程,让它继续执行。 C++ 中的条件变量一般需要和互斥锁一起使用,以保证线程安全。当一个线程等待条件变量时,它会释放互斥锁,让其他线程可以继续执行,等到条件变量被唤醒后,线程会重新获得互斥锁并继续执行。 下面是一个简单的示例代码: ```cpp #include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; std::condition_variable cv; bool ready = false; void worker_thread() { // do some work { std::lock_guard<std::mutex> lk(mtx); ready = true; } cv.notify_one(); // 通知等待的线程 } int main() { std::thread worker(worker_thread); // 等待条件变量 { std::unique_lock<std::mutex> lk(mtx); cv.wait(lk, []{ return ready; }); // 等待条件变量被唤醒 } std::cout << "Worker thread finished\n"; worker.join(); return 0; } ``` 在这个示例中,我们新开了一个线程 `worker_thread`,它会在一段时间后设置条件变量 `ready` 为 `true`,然后通知等待的线程。在 `main` 函数中,我们首先获得了互斥锁 `mtx`,然后调用 `cv.wait` 等待条件变量被唤醒。在等待期间,线程会释放互斥锁,让 `worker_thread` 可以继续执行。等到 `worker_thread` 设置了条件变量并通知后,`main` 函数会重新获得互斥锁并继续执行。最后,我们等待 `worker_thread` 结束并回收资源。 希望这个示例可以帮助你理解条件变量多线程中的使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值