C++ condition_variable
一、使用场景
在主线程中创建一个子线程去计数,计数累计100次后认为成功,并告诉主线程;主线程收到计数100次完成的信息后继续往下执行
二、条件变量的成员函数
wait:当前线程调用 wait() 后将被阻塞,直到另一个线程调用 noteify() 唤醒当前线程,使其被阻塞的线程继续运行。
①void wait(unique_lock<mutex>& _Lck)();
②template <class _Predicate>
void wait(unique_lock<mutex>& _Lck, _Predicate _Pred) ;
_Pred : wait 的预测条件,
只有当 _Pred 为 false 且获取锁后调用 wait() 才会阻塞当前线程;
只有当 _Pred 为 true 且获取锁后 收到唤醒通知后 才会解除阻塞;
wait_for:可以指定一个时间段,在当前线程收到唤醒通知或指定的时间超时之前,该线程都会处于阻塞状态;超时或收到线程通知后返回
enum class cv_status {
no_timeout,
timeout };
①cv_status wait_for(unique_lock<mutex>& _Lck, const chrono::duration<_Rep, _Period>& _Rel_time) ;
②template <class _Rep, class _Period, class _Predicate>
bool wait_for(unique_lock<mutex>& _Lck, const chrono::duration<_Rep, _Period>& _Rel_time, _Predicate _Pred);
_Rel_time:等待的时间段,_Pred : wait_for的预测条件
当 _Pred 为 true 时,立刻唤醒线程,返回 true(_Pred 的状态),无需等待超时时间;
当 _Pred 为 false 时,超过指定时间段未收到 notify_one 信号,唤醒线程,返回 false
指定时间段内收到 notify_one 信号时,取决于_Pred 的状态,若为 _Pred 为 false,线程依然阻塞,返回 false(_Pred 的状态)
三、使用方法
#include <iostream>#include <thread>#include <mutex>#include <condition_variable>
int main(){ /************************可以作为 While 的条件**************************/ int i = 0; bool while_Out = false; std::mutex while_mtx; std::condition_variable while_cv; std::unique_lock<std::mutex>guard(while_mtx); while (while_cv.wait_for(guard, std::chrono::milliseconds(10), [&] {return while_Out == true; }) == false) {//当 while_Out 为 false 时,等待 10ms,返回 false,进入 while 循环 if (i == 50) { while_Out = true;//当 while_Out 为 true 时,下次进行 wait_for 时无需等待超时时间,立刻返回 true ,结束循环 while_cv.notify_one();//因为是同步,所以 notify_one 没有作用,要先走完 while } i++; std::cout << i << std::endl;//所以会输出51 } std::cout << "test finish" << std::endl; /************************可以作为 While 的条件**************************/ return 0;}
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <condition_variable>
#include <ctime>
#include <thread>
#include <iomanip> void Get_time()
{
std::time_t newTime = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
auto formatTime = std::put_time(std::localtime(&newTime), "%Y-%m-%d %X");
std::cout << "current time= " << formatTime << std::endl;
} bool g_Out = false;
std::mutex g_mtx;
std::condition_variable g_cv; void test()
{
int i = 0;
while (true)
{
i++;
if (i == 50)
{
Get_time();
g_Out = true;
g_cv.notify_one();
std::cout << " 唤醒主线程" << std::endl;
}
}
} int main()
{
g_Out = false;//阻塞主线程
std::thread t1(test);
t1.detach();
std::unique_lock<std::mutex>guard(g_mtx);
Get_time();
std::cout << " 阻塞主线程" << std::endl;
int ret = g_cv.wait_for(guard, std::chrono::minutes(1), [&] {return g_Out == true; });
std::cout << ret << std::endl;
//当 _Pred == false 时,在指定时间段(1分钟)内进入阻塞状态,
//如果一直未接收到 notify_one 信号则超时唤醒线程,返回 _Pred 值
//如果中途接收到 notify_one 信号:
//①_Pred == true 则唤醒线程,返回 true;
//②_Pred == false 则依然阻塞线程,直至超时返回 _Pred 值;
return 0;
}
C++ condition_variable的更多相关文章
- C++11 并发指南五(std::condition_variable 详解)
前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...
- vs2012 condition_variable notify_one 崩溃
vs2012项目中用到 condition_variable系统方法,程序运行过程过程中偶尔出现notify_one崩溃, 程序运行的服务器系统版本是windows server 2008 R2 SP ...
- 漫话C++0x(五)—- thread, mutex, condition_variable
熟悉C++98的朋友,应该都知道,在C++98中没有thread, mutex, condition_variable这些与concurrency相关的特性支持,如果需要写多线程相关程序,都要借助于不 ...
- C++11并行编程-条件变量(condition_variable)详细说明
<condition_variable >头文件主要包含有类和函数相关的条件变量. 包括相关类 std::condition_variable和 std::condition_variab ...
- 通过c++11的condition_variable实现的有最大缓存限制的队列
之前曾写过一个通过C++11的condition_variable实现的有最大缓存限制的队列,底层使用std::queue来实现,如果想要提升性能的话,可以考虑改用固定的长度环形数组.环形数组实现如下 ...
- C++11并发——多线程条件变量std::condition_variable(四)
https://www.jianshu.com/p/a31d4fb5594f https://blog.csdn.net/y396397735/article/details/81272752 htt ...
- C++并发编程 条件变量 condition_variable,线程安全队列示例
1. 背景 c++11中提供了对线程与条件变量的更好支持,对于写多线程程序方便了很多. 再看c++并发编程,记一下学习笔记. 2. c++11 提供的相关api 3.1 wait wait用于无条件等 ...
- 基于std::mutex std::lock_guard std::condition_variable 和std::async实现的简单同步队列
C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为.通常的做法是在修改共享数据成员的时候进行加锁--mutex.在使用锁的时候通 ...
- C++ 0x 使用condition_variable 与 Mutex 同步两个线程
Mutex : 锁 同一时间只允许一个线程访问其代码内容 拟人 : 就是一把锁而已,可以lock unlock, 谁都可以拿到锁,打开门进屋,但进去后,就会把门锁上(lock) 别人想进就得等他出 ...
- c++11多线程学习笔记之三 condition_variable使用
从windows角度来说,condition_variable类似event. 阻塞等待出发,不过condition_variable可以批量出发. 代码如下: // 1111111.cpp : 定义 ...
随机推荐
- URAL2127 Determinant of a Graph 题解
这个题真的折磨了我超久的.全网几乎搜不到一个详细的题解,俺来写写吧. 题意:给你一个无自环无重边的连通无向图,求它邻接矩阵的行列式的值. \(n\le 2*10^5,n-1\le m \le n+50 ...
- Python中用requests处理cookies的3种方法
在接口测试中,大多数项目的接口是需要登录后进行操作的,经常用到requests库进行模拟登录及登录后的操作,下面是我不断踩坑后总结出来的关于登录凭证cookies的3种操作方法. 一. 用 reque ...
- Path Manipulation安全漏洞处理方法
1 public static String pathManipulation(String path) { 2 HashMap<String, String> map = new Has ...
- ES6的模块化(import引入)
先做个前提,新建三个模块JS文件m1,m2,m3,其中m1.js 为分别暴露,m2.js 为统一暴露,m3.js 为默认暴露.接下来进行文件的import引入 1.通用的引入方式,这种方式适合任何暴露 ...
- docker (mysql 8.+ )主从同步
1.环境centos7.5 docker 2.下载docker 版本的mysql 启动容器 docker run --name mysql_master -p 3306:3306 -e MYSQL_ ...
- ts补充
// ts中类型主要包括 1.元组 2.接口(对象,函数,构造器)类型 3.枚举类型 4.字面量类型 5.特殊类型 // ts中类型类型运算主要包括 1.条件类型 : 2.推导类型 3.联合类型 4. ...
- 什么是spring框架
一bai.概念:1. spring是开源的轻量级框架2 spring核心主要两部分:(1)aop:面向切面编程,扩展功能不是修改源代码实现(2)ioc:控制反转,- 比如有一个类,在类里面有方法(不是 ...
- Jetpack compose学习笔记之列表(布局)
一,简介 Jetpack compose中的布局主要分为Column,Row,Box. 二,Column创建的列表 Column创建list时,不管内容是在屏幕内还是屏幕外,都会将list的内容全部创 ...
- C#找出可用TCP端口,仅两行代码就搞定
var start = 2222; var ps = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners().Select ...
- Tomcat启动—本地文件夹
打开tomcat文件夹 打开bin目录 在路径这里输入cmd 就可以直接跳转到当前页面下 接下来我们在cmd命令中启动startup.bat (记得设置java环境变量) 这里我没设置utf-8 我无 ...