概述

condition_variable类似于信号量机制,实现了线程的等待和唤醒。

函数接口:
wait() :阻塞等待的同时释放锁(原子操作),还可以添加阻塞判断函数,详见代码

notify_all() : 唤醒所有阻塞等待的线程

notify_one(): 唤醒某一个等待的线程

代码

#include<iostream>
#include<thread>
#include<mutex>
#include<condition_variable>
#include<chrono>
using namespace std;
mutex m;
condition_variable cond;
int LOOP = 10;
int flag = 0;void fun(int id) {for (int i = 0; i < LOOP; i++) {unique_lock<mutex> lk(m);   //加锁//写法1,while循环比较,多次唤醒时,只要不满足条件就阻塞,if只判断一次会出错/*while (id != flag)cond.wait(lk);*///写法2,实现原理和上面一样 ,id != flag时会阻塞,唤醒时继续判断,id == flag才会唤醒成功cond.wait(lk, [=]() {return id == flag;});cout << (char)('A' + id) << " ";flag = (flag + 1) % 3;cond.notify_all();}
}
int main() {thread A(fun, 0);thread B(fun, 1);thread C(fun, 2);A.join();B.join();C.join();cout << endl;cout << "main end" << endl;return 0;
}

测试结果:

semaphore源码

#pragma once
#include<mutex>
#include<condition_variable>
class semaphore {public:semaphore(long count = 0) :count(count) {}void wait() {std::unique_lock<std::mutex>lock(mx);cond.wait(lock, [&]() {return count > 0; });--count;}void signal() {std::unique_lock<std::mutex>lock(mx);++count;cond.notify_one();}private:std::mutex mx;std::condition_variable cond;long count;
};

C++ condition_variable用法相关推荐

  1. condition_variable用法

    参考文章:https://blog.csdn.net/princeteng/article/details/103945610添加链接描述 condition_variable con; 有两种用法. ...

  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. 最近工作好忙,自己的软件又得落下很长一段时间了~
  2. Maven修改本地仓库位置
  3. Initial load DNL_CUST_PROD0 并找出SAP S4表和CRM表的mapping关系
  4. P4055-[JSOI2009]游戏【网络流,博弈】
  5. 系统架构----(2)大型网站架构之架构模式
  6. C++array容器用法解析,它与普通数组究竟有何不同?
  7. sql按年、月、日、查询排序
  8. 降维系列之 MDS多维缩放 与 ISOMAP 等度量映射
  9. Java最新手机号正则验证
  10. TYUT太原理工大学2022数据库考试题型大纲
  11. 死亡之谷 峨边黑竹沟
  12. Linux—系统安全及应用
  13. 考试用计算机反思800字,考试作弊检讨书800字(精选5篇)
  14. 由浅入深玩转华为WLAN—19 漫游系列(6)不同AC之间AP漫游的概述以及二三层漫游处理过程
  15. 我想请你,书写新世界!
  16. 鸟人的Android揭秘(7)——搭建Android SDK开发环境(三)
  17. 聊聊rel=external nofollow和rel=noopener noreferrer
  18. 手把手教你从0到1搭建vue3+ts+vite+element-plus简易后台管理系统
  19. CSS Border (边框)
  20. pureftpd 匿名访问

热门文章

  1. 王爽 汇编语言 第六章 实验五
  2. 2021年线上录制视频汇总暨2022年样卷开始录制的消息
  3. 回顾10年程序员职场经历
  4. 什么是”归一化“处理?
  5. 微信小程序同步方法,方法内顺序从上至下依次执行
  6. PHP人才网站对接内蒙古自治区四位一体就业服务云平台
  7. 芯片制造业变天:高通沦落 Nvidia博通崛起
  8. [转载]打工辛酸路:我是一朵飘零的花之87
  9. win10/win8换win7教程
  10. react——强制刷新页面三种方式(更)