C++ condition_variable用法
概述
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用法相关推荐
- condition_variable用法
参考文章:https://blog.csdn.net/princeteng/article/details/103945610添加链接描述 condition_variable con; 有两种用法. ...
- C++11 condition_variable条件变量用法
C++11 condition_variable条件变量用法 1 什么是条件变量 2 condition_variable类定义 2.1 wait函数 3 condition_variable用法 3 ...
- C++11中std::condition_variable的使用
<condition_variable>是C++标准程序库中的一个头文件,定义了C++11标准中的一些用于并发编程时表示条件变量的类与方法等. 条件变量是并发程序设计中的一种控制结构.多个 ...
- Multi-thread--C++11中std::condition_variable的使用
<condition_variable>是C++标准程序库中的一个头文件,定义了C++11标准中的一些用于并发编程时表示条件变量的类与方法等. 条件变量是并发程序设计中的一种控制结构.多个 ...
- 机器人领域C++/ROS/TCP编程
2020-12-03------------------------------------------------------------------------------------------ ...
- 【转】C++11 并发指南五(std::condition_variable 详解)
http://www.cnblogs.com/haippy/p/3252041.html 前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三 ...
- 标准化条件变量 -- condition_variable
std::condition_variable是条件变.Linux下使用 Pthread库中的 pthread_cond_*() 函数提供了与条件变量相关的功能.和pthread_cond_*()一样 ...
- C++11 并发指南五(std::condition_variable 详解)
前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...
- c语言怎么定义一个条件变量,C++ 条件变量(condition_variable)
先贴一个condition_variable的讲解:https://en.cppreference.com/w/cpp/thread/condition_variable,很详细也很全面,但是是英文的 ...
最新文章
- 最近工作好忙,自己的软件又得落下很长一段时间了~
- Maven修改本地仓库位置
- Initial load DNL_CUST_PROD0 并找出SAP S4表和CRM表的mapping关系
- P4055-[JSOI2009]游戏【网络流,博弈】
- 系统架构----(2)大型网站架构之架构模式
- C++array容器用法解析,它与普通数组究竟有何不同?
- sql按年、月、日、查询排序
- 降维系列之 MDS多维缩放 与 ISOMAP 等度量映射
- Java最新手机号正则验证
- TYUT太原理工大学2022数据库考试题型大纲
- 死亡之谷 峨边黑竹沟
- Linux—系统安全及应用
- 考试用计算机反思800字,考试作弊检讨书800字(精选5篇)
- 由浅入深玩转华为WLAN—19 漫游系列(6)不同AC之间AP漫游的概述以及二三层漫游处理过程
- 我想请你,书写新世界!
- 鸟人的Android揭秘(7)——搭建Android SDK开发环境(三)
- 聊聊rel=external nofollow和rel=noopener noreferrer
- 手把手教你从0到1搭建vue3+ts+vite+element-plus简易后台管理系统
- CSS Border (边框)
- pureftpd 匿名访问