首页 > 编程语言 >c++11 std::condition_variable

c++11 std::condition_variable

时间:2023-08-02 22:26:45浏览次数:37  
标签:11 std lock 线程 notify variable unique wait

std::condition_variable

  • 需要配合unique_lock使用,wait(unique_lock<mutex>&)
  • notify_one()调用时,只有随机一个wait()线程会得到通知
  • notify_all(),所有wait()线程会被通知并得到执行
  • wait()调用会阻塞当前线程
  • wait()线程中用到的unique_lock不会阻塞notify线程中的锁
// condition_variable example
#include <iostream>           // std::cout
#include <thread>             // std::thread
#include <mutex>              // std::mutex, std::unique_lock
#include <condition_variable> // std::condition_variable
#include <chrono>

using namespace std;

namespace {
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
}

void print_id (int id) {
  std::unique_lock<std::mutex> lck(mtx);              // 这里必须使用unique_lock
  while (!ready) {
    cv.wait(lck);                                     // 这里会阻塞
    cout << "thead " << id << " notifyed..." << endl; // 被notify后才能执行
  }
  std::cout << "thread " << id << '\n';
}

void go() {
  this_thread::sleep_for(1s);             // 观察是否会被抢占mutex而阻塞(不会!)
  // std::unique_lock<std::mutex> lck(mtx);  
  std::lock_guard<std::mutex> lck(mtx);   // 这里unique_lock或者lock_gurad都行
  ready = true;
  this_thread::sleep_for(2s);
  // cv.notify_one(); // 只有一个cv.wait(lck)线程会被notify,这里因为所有10个线程都在join,会导致死锁
  cv.notify_all();    // 所有cv.wait(lck)线程会被notify
}

void ConditionVariableTest()
{
  std::thread threads[10];
  // spawn 10 threads:
  for (int i=0; i<10; ++i)
    threads[i] = std::thread(print_id,i);

  std::cout << "10 threads ready to race...\n";
  go();                       // go!

  for (auto& th : threads) th.join();
}

标签:11,std,lock,线程,notify,variable,unique,wait
From: https://www.cnblogs.com/BuzzWeek/p/17601922.html

相关文章

  • cuda11.5 paddlepaddle-gpu安装出错
    检查安装paddlepaddle-gpu版本为cuda11.5没有对应的版本报错信息RunningverifyPaddlePaddleprogram...I080216:31:52.487021271111interpretercore.cc:237]NewExecutorisRunning.W080216:31:52.487298271111gpu_resources.cc:119]PleaseNOTE:device:0,G......
  • Docker安装Oracle11g
    1.拉取oracle数据库镜像dockerpullregistry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g 2.启动oracle 自动启动镜像--restart=alwaysdockerrun-p1521:1521--nameoracle_11g-d--restart=alwaysregistry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g3......
  • 11构件图与包图
    构件图:描述封装的类及其接口、端口,以及由内嵌的构件和连接件构成的内部结构。对于那些由小的构件建成的的系统来说,构件图是很重要的,构件图是类图的变体 包图是带有标签的文件夹,包将共同工作的元素放在一个文件夹。......
  • 关于 x11 xorg wayland 的区别
           ......
  • win 11 无法安装ensp 组件VBox(版本过老)导致AR路由器报错 40,关闭win11 内存完整性 开关
        解决办法如下:1、先关闭内存完整性 2、重新安装vbox(成功) 3、启动ensp(无40报错) ......
  • SIT1145AQ 带选择性唤醒及故障保护的低功耗 CAN FD 总线收发器
    ➢符合ISO11898-2:2016和SAEJ2284-1至SAEJ2284-5标准➢拥有低功耗休眠模式以及待机模式➢支持标准CAN唤醒帧的远程唤醒,兼容ISO11898-2:2016标准的选择性唤醒帧远程唤醒➢唤醒源诊断识别功能➢总线端口±58V耐压➢±12V接收器共模输入电压➢IO口支......
  • day11 11.2 JNI案例
    【一】创建项目【1】新建utils.c在cpp文件夹下新建utils.c的源文件,后缀名是c,因为怎么用c写(.cpp是c++,不要用这个)【2】新建java类新建一个java类,类中写函数packagecom.dream.demo11;publicclassUtils{//定义一个方法,实现C中的某个方法相对应publi......
  • 让nlohmann json支持std::wstring和嵌套结构的序列化与反序列化
    nlohmannjson是一个star很高的C++json解析库。要让nlohmannjson支持某个类型T,只要给这个类型T实现一个偏特化的structadl_serializer<T>即可。adl_serializer是这个库里面针对泛型T预定义的适配器。而嵌套结构,本身就支持的。使用预定义的宏NLOHMANN_DEFINE_TYPE_NON_INTRUSI......
  • Windows下Oracle11G定时备份
    首先我们先编写定时备份用到的脚本文件 我们新建txt文本文件,输入下列内容并保存为Oracle_bak.bat 把Oracle_bak.bat文件放到oracle的目录下(其他目录也可以)@echooffecho开始备份数据库#设置备份时间格式(使用cmd输入date查看服务器时间格式,按需设置)setvar=%date:~......
  • [oeasy]python0078_变量部分总结_variable_summary
    删除变量回忆上次内容上次研究了变量的死有生就有死原本的死是在程序退出的时候自动执行的也可以手动给变量执行死刑del  del(a)之后dir()就无法在当前作用域(scope)内观察到这个变量了也就是说a死了......