参考文章:https://blog.csdn.net/princeteng/article/details/103945610添加链接描述

condition_variable con;
有两种用法。

//用法一:
con.wait(lck, [] {return !que.empty(); });//wait直到后边返回true时放开
//用法二:
while(que.empty()){con.wait(lck)
}//和用法一语句相等。

注意事项:当线程因为条件而在wait处等待时,就算外部条件改变了使得条件满足放开的限制,线程也不会继续。需要调用notify_one或者notify_all去告诉线程,这样才可以令线程继续。

#include "stdafx.h"
#include <iostream>
#include <mutex>    //mutex & unique_lock
#include <thread>
#include <condition_variable>
#include<vector>
using namespace std;mutex mtx;
condition_variable cv;
int cargo = 0;bool pred() { return cargo != 0; }std::vector< std::thread > workers;
void consumer(int n)
{for (size_t i = 0; i < n; i++){workers.emplace_back([i] {        cout << "sd" << endl;unique_lock<mutex> lck(mtx);cout << "完成阻塞 i = " << i << endl;cv.wait(lck, pred);//阻塞直到pred满足, 即 cargo != 0, wait 会调用mtx.unlock()cout << i << "\n"; });}
}int main()
{thread consume(consumer, 10);consume.join();return 0;
}


从上代码和结果可以看到,condition_variable只是阻塞当前线程(也可以叫函数,即代码中的lambda函数),而for循环依旧执行了。


#include <iostream>
#include <mutex>    //mutex & unique_lock
#include <thread>
#include <condition_variable>
using namespace std;mutex mtx;
condition_variable cv;
int cargo = 0;bool pred() { return cargo != 0; }void consumer(int n)
{for (size_t i = 0; i < n; i++){cout << "运行了" << i << "次" << endl;unique_lock<mutex> lck(mtx);cv.wait(lck, pred);//阻塞直到pred满足, 即 cargo != 0, wait 会调用mtx.unlock()cout << "cargo ="<<cargo << "\n";cargo = 0;  //再将cargo置为0, 导致主线程中的while可以执行}
}
int main()
{thread consume(consumer, 10);for (int i = 0; i<10; i++) {while (pred()) { //不满足条件则yield, cargo != 0则阻塞,等待consumer将cargo设置为0this_thread::yield();}//yield表示当pred满足时,主线程不执行,把主线程的时间片让给consumer线程,让他先执行。相当于当每一次pred满足时,主线程都会停下来等comsumer。unique_lock<mutex> lck(mtx);//调用mtx.lock()cargo = i + 1;cv.notify_one();}consume.join();return 0;
}

当把yield给去掉时,主线程并不会等待comsumer线程,自顾自的获得锁,并对cargo进行加减。导致尽管notify_one了comsumer线程。但是由于主线程和comsumer线程执行的快慢并不对等,导致comsumer线程对cargo的读取并不连续和固定。

int main()
{thread consume(consumer, 10);for (int i = 0; i<10; i++) {cout << "i=" << i << endl;unique_lock<mutex> lck(mtx);//调用mtx.lock()cargo = i + 1;cv.notify_one();}consume.join();return 0;
}


condition_variable用法相关推荐

  1. C++ condition_variable用法

    概述 condition_variable类似于信号量机制,实现了线程的等待和唤醒. 函数接口: wait() :阻塞等待的同时释放锁(原子操作),还可以添加阻塞判断函数,详见代码 notify_al ...

  2. C++11 condition_variable条件变量用法

    C++11 condition_variable条件变量用法 1 什么是条件变量 2 condition_variable类定义 2.1 wait函数 3 condition_variable用法 3 ...

  3. C++11中std::condition_variable的使用

    <condition_variable>是C++标准程序库中的一个头文件,定义了C++11标准中的一些用于并发编程时表示条件变量的类与方法等. 条件变量是并发程序设计中的一种控制结构.多个 ...

  4. Multi-thread--C++11中std::condition_variable的使用

    <condition_variable>是C++标准程序库中的一个头文件,定义了C++11标准中的一些用于并发编程时表示条件变量的类与方法等. 条件变量是并发程序设计中的一种控制结构.多个 ...

  5. 机器人领域C++/ROS/TCP编程

    2020-12-03------------------------------------------------------------------------------------------ ...

  6. 【转】C++11 并发指南五(std::condition_variable 详解)

    http://www.cnblogs.com/haippy/p/3252041.html 前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三 ...

  7. 标准化条件变量 -- condition_variable

    std::condition_variable是条件变.Linux下使用 Pthread库中的 pthread_cond_*() 函数提供了与条件变量相关的功能.和pthread_cond_*()一样 ...

  8. C++11 并发指南五(std::condition_variable 详解)

    前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...

  9. c语言怎么定义一个条件变量,C++ 条件变量(condition_variable)

    先贴一个condition_variable的讲解:https://en.cppreference.com/w/cpp/thread/condition_variable,很详细也很全面,但是是英文的 ...

最新文章

  1. 【总结】sqli-labs Less(1-35) 小结
  2. 如果你是Python初学者,就从这个开始
  3. php 更新数据库失败,php 更新数据库中断的解决方法
  4. k8s volume卷
  5. 04_ClickHouse表引擎概述、MergeTree系列引擎、Log系列引擎、集成引擎、特定功能的引擎(学习笔记)
  6. JavaScript高级程序设计---学习笔记(四)
  7. java日历类add方法_Java日历setMinimalDaysInFirstWeek()方法与示例
  8. php post请求后端拿不到值_Ajax 提交POST后,后台php 无法获取$POST值
  9. 一个简单而强大的单片机内存管理器-不带内存碎片整理
  10. 简单类名转为class_13 网页各区域div的常见类名
  11. VirtualBox安装MAC虚拟机,屏幕分辨率小,扩大的办法
  12. Qt 信号槽的应用(二)
  13. Spring Security Oauth2 JWT
  14. 疯狂游戏-研发一面-校招面经
  15. 四川理工计算机专业好不好,急!!!!四川理工 、 宜宾学院 、 内江师范学院 哪个学校计算机专业好点?...
  16. 平方逼近matlab,MATLAB上机实验——最佳平方逼近
  17. 如何使用Robostudio加载地图?
  18. 谷歌浏览器iframe兼容问题_Javascript iframe交互并兼容各种浏览器的解决方法
  19. 厦门大学数据库实验室----- 数据库系统原理
  20. win7 IIS 503错误解决方法

热门文章

  1. HDU 1254推箱子
  2. Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.Depe
  3. EOS多节点环境配置(搭建自己的EOS主网)
  4. 微分方程4_傅里叶级数
  5. 80后个性化新娱乐:玩魔术
  6. 重庆北大青鸟【学员心声】:在反思性学习中获得成长 --J14班 万*同学
  7. 安徽高考511分 想学计算机专业,高考志愿填报:安徽理科15000名,可以报考哪些计算机专业大学?...
  8. Apache的在线升级
  9. 看到华为人的工作方式,我心动了
  10. 【OpenGL编程】拖尾、刀光、剑光、尾焰效果的开发