一、使用场景

  在主线程中创建一个子线程去计数,计数累计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的更多相关文章

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

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

  2. vs2012 condition_variable notify_one 崩溃

    vs2012项目中用到 condition_variable系统方法,程序运行过程过程中偶尔出现notify_one崩溃, 程序运行的服务器系统版本是windows server 2008 R2 SP ...

  3. 漫话C++0x(五)—- thread, mutex, condition_variable

    熟悉C++98的朋友,应该都知道,在C++98中没有thread, mutex, condition_variable这些与concurrency相关的特性支持,如果需要写多线程相关程序,都要借助于不 ...

  4. C++11并行编程-条件变量(condition_variable)详细说明

    <condition_variable >头文件主要包含有类和函数相关的条件变量. 包括相关类 std::condition_variable和 std::condition_variab ...

  5. 通过c++11的condition_variable实现的有最大缓存限制的队列

    之前曾写过一个通过C++11的condition_variable实现的有最大缓存限制的队列,底层使用std::queue来实现,如果想要提升性能的话,可以考虑改用固定的长度环形数组.环形数组实现如下 ...

  6. C++11并发——多线程条件变量std::condition_variable(四)

    https://www.jianshu.com/p/a31d4fb5594f https://blog.csdn.net/y396397735/article/details/81272752 htt ...

  7. C++并发编程 条件变量 condition_variable,线程安全队列示例

    1. 背景 c++11中提供了对线程与条件变量的更好支持,对于写多线程程序方便了很多. 再看c++并发编程,记一下学习笔记. 2. c++11 提供的相关api 3.1 wait wait用于无条件等 ...

  8. 基于std::mutex std::lock_guard std::condition_variable 和std::async实现的简单同步队列

    C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为.通常的做法是在修改共享数据成员的时候进行加锁--mutex.在使用锁的时候通 ...

  9. C++ 0x 使用condition_variable 与 Mutex 同步两个线程

    Mutex : 锁   同一时间只允许一个线程访问其代码内容 拟人 : 就是一把锁而已,可以lock unlock, 谁都可以拿到锁,打开门进屋,但进去后,就会把门锁上(lock) 别人想进就得等他出 ...

  10. c++11多线程学习笔记之三 condition_variable使用

    从windows角度来说,condition_variable类似event. 阻塞等待出发,不过condition_variable可以批量出发. 代码如下: // 1111111.cpp : 定义 ...

随机推荐

  1. python装饰器中高级用法(函数加参)

    在上一章我们说到装饰器的原则和基本用法,下面来补充一下:如果函数加参,装饰器该如何变化 1,还是用上一章的源代码 2,给test2加个参数name 报错了,本来给test2加一个name参数,为了实现 ...

  2. HttpClient详细使用示例(转)

    https://blog.csdn.net/justry_deng/article/details/81042379

  3. android 集成友盟实现 第三方分享 登录(qq,新浪,微信)

    其实友盟的文档写的非常详细了,在这只是记录一下开发过程中遇到过的坑. 开发流程,先到友盟的官网注册账号创建应用,友盟的文档地址:http://dev.umeng.com/social/android/ ...

  4. 利用Canal投递MySQL Binlog到Kafka

    https://www.aboutyun.com/thread-27654-1-1.html https://www.cnblogs.com/bigdatalearnshare/p/13832709. ...

  5. Python3之并发(四)---线程锁

    一.线程锁 保证多线程数据的一致性,对锁内的资源进行锁定,同一时间只能有一个线程来修改共享的数据多个线程同时加了同一个锁对象时,先获取到锁的线程会继续运行,未获取到锁的线程会处于堵塞状态,直到前面的线 ...

  6. uniapp滚动组件scroll-view

    //scroll-x="true"  || scroll-y="true" <view class="scroll-view"> ...

  7. CImage类使用

    前言          CImage类是基于GDI+的,但是这里为什么要讲归于GDI? 主要是基于这样的考虑: 在GDI+环境中,我们可以直接使用GDI+ ,没多少必要再使用CImage类 但是,如果 ...

  8. Ant Design 抽屉(tabel)

    效果图如下,因部分涉及到人员隐私,所以打码了,就是一些图片文字信息. 有不足的地方可以麻烦提出来的,一起学习的. <template> <a-drawer v-model:visib ...

  9. [530] C3 Rise Of Darkness Opcodez

    [530] C3 Rise Of Darkness Client 00 SendProtocolVersion 01 MoveBackwardToLocation 02 Say 03 RequestE ...

  10. Tomcat9启动闪退或者在windows服务中启动异常以及启动日志乱码问题

    首先虽然jdk6以后不需要在环境变量中额外配置jre了,但是我在tomcat的bin下startup.bat时启动时发现 可见用到了JRE_HOME,所以你需要去额外配置一下,否则会出现另外一种错误, ...