首页 > 编程语言 >C++ Thread 条件变量

C++ Thread 条件变量

时间:2023-10-04 17:11:37浏览次数:43  
标签:std goods 变量 Thread C++ lck 线程 cv wait

Condition_Variable

介绍

  • 条件变量是利用线程间共享的全局变量进行同步的一种机制
  • 条件变量是为了控制多线程有顺序地访问共享资源,它和互斥量协同控制多线程有序,互斥地访问共享资源,重要解决的问题是生产者和消费者的问题

variable_condition

  • 该类是专门结合 unique_lock 使用

variable_condition_any

  • 该类可以搭配任意的一个线程锁使用

函数操作

  1. wait
    • 等待通知
  2. wait_for
    • 等待到收到通知或者超时
  3. notify_one
    • 通知一个等待的线程
  4. notify_all
    • 通知所有的线程

代码

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

std::mutex mtx;
std::condition_variable cv;
bool is_goods = false;

bool judgeGoods()
{
    return is_goods == true;
}

void consumer(int n)
{
    for(int i = 0; i < n; ++i) {
        std::unique_lock<std::mutex> lck(mtx);
        // while (is_goods)
        // {
        //     cv.wait(lck);
        // }
        // consumer can work if there are goods, if no, wait
        cv.wait(lck, []{ return !is_goods;});
        is_goods = true;

        std::cout << "Consumer : " << i << std::endl;
        cv.notify_one();
    }
}

void producer(int n)
{
    for(int i = 0; i < n; ++i) {
        std::unique_lock<std::mutex> lck(mtx);
        // while (!is_goods)
        // {
        //     cv.wait(lck);
        // }
        cv.wait(lck, []{ return is_goods;});
        is_goods = false;

        std::cout << "Producer : " << i << std::endl;
        cv.notify_one();
    }    
}

int main()
{
    std::thread t1(consumer, 10);
    std::thread t2(producer, 10);

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

    return 0;
}

总结

  • 条件变量和互斥锁一起使用主要是用来解决是生产者和消费者的问题,其中使用的步骤如下
  1. 定义互斥锁和条件变量
std::condition_variable cv
std::mutex mtx;
  1. 等待条件满足
std::unique_lock<std::mutex> lck(mtx);
cv.wait(lck, []{ return condition;});
// wait 函数可以接受一个函数,该函数返回 true 表示条件已经满足
// 如果条件不满足,wait() 会释放锁并将线程挂起,直至条件满足
  1. 通知条件满足
cv.notify_one();    // 唤醒一个等待的线程
cv.notify_all();    // 唤醒所有等待的线程

标签:std,goods,变量,Thread,C++,lck,线程,cv,wait
From: https://www.cnblogs.com/wanghao-boke/p/17742482.html

相关文章

  • VC++ MFC 编程--CMap的使用
    本文翻译自: CMapHow-to-CodeProject介绍像我这样的程序员,在CMap之前学习了STL::map,总是认为CMap很难使用,并且总是尝试以STL::map的方式使用CMap。在本文中,我将解释CMap,以及如何将它用于您自己的自定义类。在本文的最后,我将展示一个如何正确使用CMap与CString*的例子(注意,我......
  • C/C++学习 -- 分组加密算法(DES算法)
    数据加密标准(DataEncryptionStandard,DES)是一种对称密钥加密算法,是信息安全领域的经典之作。本文将深入探讨DES算法的概述、特点、原理,以及提供C语言和C++语言实现DES算法的代码案例。一、DES算法概述DES算法是一种对称密钥加密算法,由IBM于1977年开发并于1977年被美国国家标准局(NI......
  • QFluentWidgets: 基于 C++ Qt 的 Fluent Design 组件库
    简介QFluentWidgets是一个基于Qt的FluentDesigner组件库,内置超过150个开箱即用的FluentDesigner组件,支持亮暗主题无缝切换和自定义主题色。搭配所见即所得的FluentDesigner软件,只需拖拖拽拽,不用编写一行QSS,就能快速搭建现代化软件界面。官网地址:https://qfluentw......
  • flask上下文、g变量、current_app
    在flask中的上下文分为两种:请求上下文(requestcontext)也就是和请求相关的上下文,记录一些请求相关的数据。包含:1、request请求对象2、session会话应用上下文(appcontext)记录一些和flask的应用(app=Flask(name))的上下文数据,主要包含:**1、current_app**在项目其它......
  • C++ bitset 用法和应用
    C++的bitset在bitset头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间。下面是具体用法构造函数bitset常用构造函数有四种,如下bitset<4>bitset1;//无参构造,长度为4,默认每一位为0bitset<8>bitset2(12);//长度为8,二进制保存,前......
  • C++ typedef用法详解
    typedef的语法描述 在现实生活中,信息的概念可能是长度,数量和面积等。在C语言中,信息被抽象为int、float和double等基本数据类型。从基本数据类型名称上,不能够看出其所代表的物理属性,并且int、float和double为系统关键字,不可以修改。为了解决用户自定义数据类型名称的需求,C语言......
  • C++ 初始化列表
    何谓初始化列表与其他函数不同,构造函数除了有名字,参数列表和函数体之外,还可以有初始化列表,初始化列表以冒号开头,后跟一系列以逗号分隔的初始化字段。在C++中,struct和class的唯一区别是默认的访问性不同,而这里我们不考虑访问性的问题,所以下面的代码都以struct来演示。structfoo......
  • C++ thread 互斥操作
    ThreadMutexstd::mutex是C++11最基本的互斥量,该类的实例化对象提供了资源独占所有权的特性,用于保护共享数据免受多个线程同时访问的同步原语。Mutex用法头文件#include<mutex>类型std::mutex最基础的Mutex类std::recursive_mutex递归的Mutex类std......
  • 引用变量传参例题
    publicclassTest{publicstaticvoidmain(String[]args){StringBuffera=newStringBuffer("A");StringBufferb=newStringBuffer("B");operate(a,b);System.out.println(a+""+b);......
  • '''实验1 只有温度和时间 每个物料的初始温度和初始时间不一样 无分类变量需转为读热
    '''目标:拟合物料冷却规律分类变量:物料规格,冷却方式连续变量:温度,时间其他因素:车间温度现实因素:初始温度,初始时间需求因素:目标温度的时间,目标温度的时长(时间-初始时间),当前时间的温度不加入分类变量则为单个线性模型''''''实验1只有温度和时间每个物料的初始温......