首页 > 其他分享 >条件变量condition_variable用法学习

条件变量condition_variable用法学习

时间:2024-07-07 14:20:27浏览次数:20  
标签:std count 用法 variable include 唤醒 condition

转自:https://www.cnblogs.com/fenghualong/p/13855360.html

1.介绍

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

  • wait() :阻塞等待的同时释放锁(原子操作),还可以添加阻塞判断函数,详见代码
  • notify_all() : 唤醒所有阻塞等待的线程
  • notify_one(): 唤醒某一个等待的线程

2.例子

锁+条件变量 实现等待唤醒。

#include <condition_variable>
#include <mutex>
#include <thread>

std::mutex mylock;
std::condition_variable condVar;

bool dataReady{false};

void waitingForWork() {
    std::cout << "Waiting ..." << std::endl;
    std::unique_lock<std::mutex> l(mylock);  // 加了unique_lock锁
    condVar.wait(l, []{return dataReady;});           // (4)
    std::cout << "Running ..." << std::endl;
}

void setDataReady() {
    {
        std::lock_guard<std::mutex> l{mylock};  // 加了lock_guard锁
        dataReady = true;
    }
    std::cout << "Data prepared, notify one" << std::endl;
    condVar.notify_one();                             // (3)
}

int main(int argc, char const *argv[])
{
    std::cout << "==========Begin==========" << std::endl;

    std::thread t1(waitingForWork);                    // (1)
    std::thread t2(setDataReady);                      // (2)

    t1.join();
    t2.join();

    std::cout << "===========End===========" << std::endl;
    cout<<endl;
    return 0;
}
// 运行结果
-> % ./main
==========Begin==========
Waiting ...
Data prepared, notify one
Running ...
===========End===========

如果不用锁和等待条件控制,可能会导致虚假唤醒和唤醒丢失问题。

3.用条件变量实现信号量

https://blog.csdn.net/qq_24447809/article/details/115906017

#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;
};

  

标签:std,count,用法,variable,include,唤醒,condition
From: https://www.cnblogs.com/BlueBlueSea/p/18288457

相关文章

  • DAY 1: C语言异或(^)以及按位与(&)的用法
    1.异或(^)的定义        在C语言中,异或操作符是^。异或操作符用于对两个操作数执行按位异或运算,即只有在两个操作数对应位不同时,结果为1。即相同为0不同为1。2.重要结论    1.任何一个数,假定为a,0^a等于a(不进位计算求和),a^a等于0。        2.异或运......
  • searchBar组件的用法
    文章目录1.概念介绍2.使用方法3.代码与效果3.1示例代码3.2运行效果4.内容总结我们在上一章回中介绍了"Material3中的IconButton"相关的内容,本章回中将介绍SearchBar组件.闲话休提,让我们一起TalkFlutter吧。1.概念介绍我们在本章回中介绍的SearchBar是指......
  • A value of type 'Scaffold?' can't be assigned to a variable of type 'Scaffold&#0
    原来的代码classContextRouteextendsStatelessWidget{constContextRoute();@overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:Text("Context测试"),),body:Container(......
  • C++容器map的常见用法
    文章目录1.map和multimap容器1.map容器的构造和赋值1.构造函数2.赋值操作2.map容器的大小和交换1.获取大小2.交换内容3.map容器的插入和删除1.插入元素2.删除元素3.注意事项4.map容器的查找和统计1.查找元素2.统计元素3.示例5.map容器的排序1.自定义排序规则2.注意点......
  • Arthas企业实战用法(全网最详细!!!)
    一、简介1、项目所在位置2、安装Arthas   1. 下载arthas-boot.jar   2.运行arthas-boot.jar   3.选择进程 3、卸载Arthas二、核心监视功能1、monitor:监控方法的执行情况2、watch:检测函数返回值3、trace:根据路径追踪,并记录消耗时间4、stack:输出当......
  • Windows编程之多线程事件对象(Event Object)用法详解
    目录一、前言二、基础用法三、API详解1.创建事件对象2控制事件状态3.等待事件对象:四、实战案例1.案例描述 2.代码设计 3.总设计代码4.运行结果一、前言        事件对象(EventObject)是我们在大型项目中,进行多线程同步处理的时候经常用到的一种内核对象......
  • 学懂C#编程:WPF应用开发系列——WPF之ComboBox控件的详细用法
    WPF(WindowsPresentationFoundation)中的ComboBox控件是一个下拉列表控件,允许用户从一组预定义的选项中选择一个选项。以下是ComboBox控件的详细用法,并附带示例说明。ComboBox的基本用法1.XAML定义:在XAML中定义一个ComboBox控件,并添加一些选项。<Windowx:Class="ComboBox......
  • 关于iframe标签用法
    iframe是啥?概念:  iframe是HTML的一个标签,用于在网页中嵌入另一个HTML文档。通俗来讲就是你自己的html页面里面可以随便拿一块空间嵌套别的网页。你们看到这个页面两侧的广告(google广告)。下面是我自己在自己页面嵌套的youtube视频~ 代码:效果 iframe的属性:sr......
  • 60种AI工具用法 学会探索AI的无限可能
    摘要:本文综述了人工智能(AI)工具的多种应用,旨在展示AI技术在不同领域的潜力和实用性。从文本生成到数据分析,再到内容创作和编辑,AI工具正逐步改变我们的工作和学习方式。**关键词:**人工智能,工具应用,效率提升,技术综述1.引言随着人工智能技术的快速发展,AI工具已成为提高工作效......
  • Vue的常见指令及用法案例
    Vue会根据不同的标签指令,实现不同的功能。指令:指的是带有v-前缀的的特殊标签属性。我们常见的vue指令有:1.v-html:类似于js中innerHTML,用于设置元素的HTML。案例如下:<divid="app"><divv-html="msg"></div><divv-html="h"></div></di......