条件变量详解

概述

条件变量是限制线程执行的一种机制,即在某些条件满足之前限制线程的执行。这种限制的目的,大多是为了减少线程之间信息闭塞,达到线程同步,从而提高线程之间的通信效率。

线程中访问共享数据的代码常常带有一定的逻辑顺序(如数据的添加和删除)。而条件变量的目的就是将这些线程之间的代码的执行与逻辑顺序相吻合,从而避免线程不断的if判断是否达到执行要求。举个贴近的生活,你和你的好兄弟一起请求班上的好学生帮你们写作业,你好兄弟的作业先写,然后再写你的,着急的你一直询问好学生是不是轮到你了,这样会不会让好学生很烦!!!因此就应该等你的好兄弟拿到作业后再由他通知你该你的作业了。

std::condition_variable

std::condition_variable(条件变量)是C++11引入的一个类,通常与互斥量一起使用,确保共享数据安全并同步线程。使用std::condition_variable要使用#include<condition_variable>将头文件包含进来。

std::condition_variable主要通过wait()、notify_one()、notify_all()三个成员实现以上功能。wait()可以接收一个shared_lock<std::mutex>类型的参数,当线程执行到std::condition_variable成员调用wait()时,线程就会被阻塞到本行代码,同时释放锁。等待其他线程调用notify_one()通知其可以继续执行,或者调用notify_all()通知所有被该条件变量阻塞的线程继续执行。当wait()被唤醒后,就会不断尝试获取锁。直到获得锁后,才会执行后续代码。如果线程并未被阻塞或者并未被wait()阻塞,其他线程调用notify_one()或者notify_all()对其不起作用。

#include<iostream>
#include<thread>
#include<list>
#include<mutex>
#include<condition_variable>
using namespace std;
class A
{
private:mutex mymutex;list<int> mydata;condition_variable mycond;
public:void indata(){for (int i = 0; i < 1000; i++){unique_lock<mutex> mylock(mymutex);mydata.push_back(i);mycond.notify_one();}}void outdata(){for (int i = 0; i < 1000; i++){unique_lock<mutex> mylock(mymutex);mycond.wait(mylock);mydata.pop_front();}}
};int main()
{A a;thread myinthread(&A::indata ,&a );thread myoutthread(&A::outdata,&a);myinthread.join();myoutthread.join();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/9493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

处理解决python

1、问题现象&#xff1a; ModuleNotFoundError: No module named pkg_resources 2、解决方案 安装pip install setuptools即可解决&#xff1a;

Windows环境下VSCode C无法跳转自动补全

前言&#xff1a; 本文记录了自己在配置 Windows环境下 VSCode C开发环境的遇到的问题和解决方法。 参考: vscode c语言没有代码提示_clangd提示不生效-CSDN博客 VSCODE无法跳转_vscode 不能跳转-CSDN博客 vscode c/c环境配置&#xff08;MinGW&#xff09;调用第三官方库…

华为OD机试 - 反射计数 - 矩阵(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

Vulstack红队评估(一)

文章目录 一、环境搭建1、网络拓扑2、web服务器(win7)配置3、域控&#xff08;winserver2008&#xff09;配置4、域内机器&#xff08;windows 2003&#xff09;配置5、调试网络是否通常 二、web渗透1、信息搜集2、端口扫描3、目录扫描4、弱口令5、phpmyadmin getshell日志gets…

OBS插件--声音波形显示

声音波形显示 波形显示是一个可以定制化的动态音频频谱图案&#xff0c;可以多音频进行可视化&#xff0c;对于音乐类主播必不可少&#xff0c;通过灵活的配置选项可以设计出非常个性化的频谱图形。 下面截图演示下操作步骤&#xff1a; 首先&#xff0c;打开 OBS直播助手 在…

探索生命奥秘的新征程:谷歌AlphaFold 3发布!

大家好&#xff01;今天和大家分享的是让人热血沸腾的消息——谷歌AlphaFold 3的发布&#xff01;这次的新版本可不仅仅是一次升级&#xff0c;而是一次生物科技的革命&#xff01; 回顾一下AlphaFold系列的历程&#xff0c;从AlphaFold 1的问世到AlphaFold 2的惊艳登场&#…

ChatGPT Web Midjourney一键集成最新版

准备工具 服务器一台 推荐使用浪浪云服务器 稳定 安全 有保障 chatgpt api 推荐好用白嫖的api 项目演示 项目部署 浏览器访问casaos 添加软件原添加 https://gitee.com/langlangy_1/CasaOS-AppStore-LangLangy/raw/master/chatmjd.zip 安装此软件 等待安装 安装后再桌面设置…

信息安全技术-分析题【太原理工大学】

没有历年题或明确说明大题会考什么&#xff0c;以下为个人猜测 简答题和选择判断占60&#xff0c;认真看题库和总结&#xff0c;能过d(^_^o) 好像说是加解密这类题会给公式让你直接套&#xff0c;但还是看一下基本原理&#xff0c;要不到时候蒙圈 1.加密算法步骤 图 1 是一个采…

Spring Boot | Spring Boot 整合 “异步任务“ 的实现

目录&#xff1a; 一、异步任务1.1 "无返回值" 异步任务调用 :① 创建项目② 编写 "异步调用方法" ( 使用 Async 注解 )③ "主程序启动类"中 开启基于 "注解" 的异步任务支持 ( 使用EnableAsync注解 )④ 编写 "控制层" 相关…

Linux 的相关应用

当涉及到 Linux 应用程序时&#xff0c;有许多优秀的选择。以下是一些在不同类别下你可能会喜欢的 Linux 应用程序&#xff1a; 1.网页浏览器&#xff1a;Google Chrome&#xff1a;功能强大且拥有完美的同步功能和丰富的扩展。Firefox&#xff1a;稳定且强大的网页浏览器。Vi…

从0到1构建AI agent【零代码】

一、前言 想象一下&#xff0c;如果AI的想象力被彻底释放&#xff0c;那将是一场怎样的革命&#xff1f;“大语言模型不过是个贪吃蛇&#xff0c;而AI Agent却能创造出‘王者荣耀’。”这不仅是网上的一句戏言&#xff0c;它预示着一个不可逆转的趋势。比尔盖茨更是一语中的&am…

【全开源】Java共享台信息共享系统源码

特色功能 信息整合与共享&#xff1a;该平台提供一站式信息整合服务&#xff0c;将各种类型的信息资源进行汇聚&#xff0c;方便用户快速查找和获取所需资源。多种共享功能&#xff1a;支持信息共享、共享车位、共享会议室、共享电动车等多种共享功能&#xff0c;提高资源利用…

【Linux】18. 进程间通信 --- System V IPC(选学)

System V IPC System V 消息队列System V 共享内存System V 信号量 system V 共享内存 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核。 换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据…

云南区块链商户平台优化开发

背景 云南区块链商户平台是全省统一区块链服务平台。依托于云南省发改委、阿里云及蚂蚁区块链的国内首个省级区块链平台——云南省区块链平台同步上线&#xff0c;助力数字云南整体升级。 网页版并不适合妈妈那辈人使用&#xff0c;没有记忆功能&#xff0c;于是打算自己开发…

k8s介绍

一、前言 Kubernetes&#xff08;通常简称为 K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序&#xff0c;它提供了丰富的功能使得用户能够轻松地管理大规模的容器集群&#xff0c;包括自动化部署和扩展、服务发现和负载均衡、存…

用 C 语言进行大模型推理:探索 llama2.c 仓库(二)

文章目录 前提如何构建一个Transformer Model模型定义模型初始化 如何构建tokenzier 和 sampler如何进行推理总结 前提 上一节我们介绍了llama2.c中如何对hugging face的权重进行处理&#xff0c;拿到了llama2.c想要的权重格式和tokenizer.bin格式。这一节我们分析下在llama2.…

vue原生div做触底加载

第一种&#xff1a; 触底加载和图片懒加载的思路一样&#xff0c;屏幕的高度加上滚动的高度快要大于最后一个元素距离顶部的高度的时候就开始加载数据&#xff1b; &#xff08;1&#xff09;clientHeight&#xff1a;屏幕的高度&#xff1b; &#xff08;2&#xff09;scro…

漫威争锋Marvel Rivals怎么搜索 锁区怎么搜 游戏搜不到怎么办

即将问世的《漫威争锋》&#xff08;Marvel Rivals&#xff09;作为一款万众期待的PvP射击游戏新星&#xff0c;荣耀携手漫威官方网站共同推出。定档5月11日清晨9时&#xff0c;封闭Alpha测试阶段将正式揭开序幕&#xff0c;持续时间长达十天之久。在此首轮测试窗口&#xff0c…

一个开源即时通讯源码

一个开源即时通讯源码 目前已经含服务端、PC、移动端即时通讯解决方案&#xff0c;主要包含以下内容。 服务端简介 不要被客户端迷惑了&#xff0c;真正值钱的是服务端&#xff0c; 服务是采用Java语言开发&#xff0c;基于spring cloud微服务体系开发的一套即时通讯服务端。…

栈结构(c语言)

1.栈的概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈&am…