std::thread库的condition_variable进行线程唤醒
来源:互联网 发布:关于网络诈骗新闻 编辑:程序博客网 时间:2024/06/05 20:03
转载请注明出处:http://my.csdn.NET/ye_shen_wei_mian
很久之前写了的测试程序,主要实现的功能是:
线程run1:
线程run1在运行过程中通过检测状态量mbAcceptKeyFrames_是否为true来判定线程run2是否已经处理其事务完毕(或者说是空闲状态,处于挂起状态)。
若检测到run2处于空闲状态,则设置状态量insertNewKeyframe为true,并通过条件变量来唤醒run2。若检测到run2处于繁忙状态(run2还没处理完成自己的事务),则不做任何操作。
之后随即run1继续处理自己的事务。
线程run2:
run2检测到insertNewKeyframe这个状态量为真时,则拿到锁锁住mutexSychron_,并设置mbAcceptKeyFrames_为false,并开始处理run2的事务,处理完毕了再释放掉锁mutexSychron_,随后把状态量mbAcceptKeyFrames_设置为true,把insertNewKeyframe设置为false。
上述功能用通俗的话来讲就是:run1通过run2挂的牌子(mbAcceptKeyFrames_)看看run2忙不忙,不忙的话(mbAcceptKeyFrames_为true)run1就可以给run2东西去忙(通过条件变量去唤醒run2,insertNewKeyframe = true),忙run1就先让run2继续忙你的我就不打扰你了。run2如果没东西忙,run2就说哦我现在不忙(令mbAcceptKeyFrames_为true,我现在没啥事干正喝着咖啡等着run1你给东西给我忙(挂起)。如果run2在忙的话,也会挂个牌子(mbAcceptKeyFrames_为false)让run1看到我现在很忙,别给我东西忙了。等run2忙完了,也会挂个牌子(mbAcceptKeyFrames_为true,insertNewKeyframe = false)说我忙完了你给我的东西了,可以接新活了,然后去喝咖啡歇着(挂起),等着run1再给他东西干。
事不宜迟吧,先上代码:
#include<iostream>#include<thread>#include<mutex>#include <condition_variable>using namespace std;bool mbAcceptKeyFrames_;std::mutex mMutexAccept_;std::mutex mutexSychron_;bool insertNewKeyframe;std::condition_variable cv; // 全局条件变量void SetAcceptKeyFrames(bool flag){std::unique_lock<std::mutex> lock(mMutexAccept_);std::cout << "Thread run2 set accepted keyframe = "<< flag <<std::endl;mbAcceptKeyFrames_ = flag;}bool AcceptKeyFrames(){std::unique_lock<std::mutex> lock(mMutexAccept_);std::cout << "Thread run1 detect accepted keyframe = " << mbAcceptKeyFrames_ << std::endl;return mbAcceptKeyFrames_;}void run1(unsigned int timstamp){//insertNewKeyframe = false;for (int i = 0; i < 10; i++){std::cout << "Thread run1 doing other operations...blablabla" << endl;}bool newKeyframeOrNot = AcceptKeyFrames();//std::unique_lock<std::mutex> lock(mutexSychron_);if (newKeyframeOrNot){std::unique_lock<std::mutex> lock(mutexSychron_);std::cout << "Thread run1 wakes up run2" << endl;insertNewKeyframe = true;cv.notify_one();lock.unlock();}for (int i = 0; i < 10; i++){std::cout << "Thread run1 doing other operations...blingblingbling" << endl;}}void run2(){while (true){SetAcceptKeyFrames(true);insertNewKeyframe = false;std::unique_lock<std::mutex> lock(mutexSychron_);while (!insertNewKeyframe)cv.wait(lock);SetAcceptKeyFrames(false);//lock.unlock();//线程被唤醒std::cout << "Thread run2 now wakes up " << std::endl;for (int i = 0; i < 100; i++){std::cout << "Thread run2 is doing its own work.. " << std::endl;}std::cout << "Thread run2's work done , go back to sleep until waked" << std::endl;lock.unlock();}}int main(){thread Thread2(&run2);for (unsigned int t = 0; t < 10000; t++){run1(t);}return 0;}
- std::thread库的condition_variable进行线程唤醒
- std::condition_variable
- Java中的线程的唤醒Thread.interrupt()
- Java中的线程的唤醒Thread.interrupt()
- C++11中std::condition_variable的使用
- STL线程 std::thread
- C++:线程(std::thread)
- 如何用通过C++11提供的std::condition_variable实现主线程控制子线程的启动和停止
- std::condition_variable 详解
- C++11 std::condition_variable
- 关于std::condition_variable需要注意的地方spurious wake-ups
- pthread的和std::thread的线程分离
- C++11 std::thread线程的多种使用方法介绍
- Thread(线程间通讯,等待唤醒机制)
- 线程的虚假唤醒
- C++ std::thread的坑
- C++ 11 的std::thread
- 黑马程序员 线程通讯——唤醒的线程需要再次进行标记值判断
- 记录一下自己可能要看的书
- VC文档"最近使用的文档"列表LoadStdProfileSettings
- eclipse 更改包名只是记录一下一直忘
- editext 两次获取焦点 , 当设 etComment.setFocusable(false);后 还学要点击两次获取焦点
- 构建微服务:Spring Boot 从听说到精通 (一)
- std::thread库的condition_variable进行线程唤醒
- bootstrap模态框页面抖动和暗黑锁定处理
- Linux系统下普遍常用的命令(会陆续更新...)
- python的graphics库的简单用法
- HDU 3037(隔板法+组合数+Lucas)
- bug宝典Python篇 environment can only contain strings
- php常见术语
- 友盟分享QQ成功后 不回调app
- Hibernate的缓存纪要