C++多线程编程(第三章 案例2,条件变量,生产者-消费者模型)

news2024/11/29 12:46:41

目录

    • 1、condition_variable
      • 1.1、生产者消费者模型
      • 1.2、改变共享变量的线程步骤
      • 1.3、等待信号读取共享变量的线程步骤
        • 1.3.1、获得改变共享变量线程共同的mutex
        • 1.3.2、wait()等待信号通知
          • 1.3.2.1、无lambda表达式
          • 1.3.2.2 lambda表达式
      • 样例代码

1、condition_variable

等待中,增加了时延和开销,用条件变量就很快及时处理

1.1、生产者消费者模型

生产者和消费者共享资源变量(list队列);
生产者生产一个产品,通知消费者消费;
消费者阻塞等待信号,获取信号后消费产品(取出list队列中数据)

1.2、改变共享变量的线程步骤

准备好信号量

std::condition_variable cv;

1、获取std::mutex(常用std::unique_lock)

unique_lock lock(mux);

2、在获取锁时进行修改;

msgs_.push_back(data);

3、释放锁并通知读取线程

lock.unlock();
cv.notify_one();//通知一个等待信号线程
cv.notify_all;//通知所有等待信号线程

1.3、等待信号读取共享变量的线程步骤

1.3.1、获得改变共享变量线程共同的mutex

unique_lock lock(mux);

1.3.2、wait()等待信号通知

1.3.2.1、无lambda表达式
//解锁lock,并阻塞等待notify_one notify_all 通知
cv.wait(lock);

//接收到通知会再次获取锁标注,也就是说如果此时mux资源被占用,wait函数会阻塞
msgs_front();
//处理数据
msgs_pop_front();

1.3.2.2 lambda表达式
cv.wait(lock,[]{return !msgs_empty();})

只在std::unique_lockstd::mutex上工作的std::condition_variable

在这里插入图片描述

样例代码

#include <thread>
#include <iostream>
#include <mutex>
#include <list>
#include <string>
#include <sstream>

using namespace std;
list<string> msgs_;
mutex mux;
condition_variable cv;//条件变量

void ThreadWrite()
{
	for (int i = 0;;i++)
	{
		stringstream ss;
		ss << "Write msg " << i;

		unique_lock<mutex> lock(mux);

		msgs_.push_back(ss.str());
		lock.unlock();//解锁
		cv.notify_one();//通知一个

		this_thread::sleep_for(1ms);
	}
}
void ThreadRead(int i)
{
	for (;;)
	{
		cout << "Read msg" << endl;
		unique_lock<mutex> lock(mux);
		cv.wait(lock);//解锁、阻塞等待信号

		mambda表达式方式
		//cv.wait(lock, [i]
		//{
		//	cout << i << " wait" << endl;//特别这句话在啥时候会进入,调用多少次,搞不清楚就用上面cv.wait更简单
		//	//return true;//只要返回true,wait就不会阻塞
		//	return !msgs_.empty();
		//	
		//	});

		//获取信号后锁定
		while (!msgs_.empty())
		{

			cout << i << "read " << msgs_.front() << endl;
			msgs_.pop_front();
		}
		if (msgs_.empty()) return;
	}
}

int main()
{

	thread th(ThreadWrite);
	th.detach();
	for (int i = 0; i < 3; i++)
	{//读取线程
		thread th2(ThreadRead,i+1);
		th2.detach();
	}

	getchar();
	return 0;
}

在这里插入图片描述

期间出差了一个月,没有时间学习,今天开始又继续学习和做笔记了…
辉2023.9.8

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

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

相关文章

数据平滑和离群值检测

目录 移动窗口方法 常见的平滑方法 检测离群值 非均匀数据 数据平滑指用于消除数据中不需要的噪声或行为的技术&#xff0c;而离群值检测用于标识与其余数据显著不同的数据点。 移动窗口方法 移动窗口方法是分批处理数据的方式&#xff0c;通常是为了从统计角度表示数据中…

Union-Find Algorithm-并查集

目录 1.概念 2.并查集的优化 1.路径压缩&#xff08;Path Compression&#xff09; 1&#xff09;隔代压缩&#xff1a; 2&#xff09;完全压缩&#xff1a; 2.按秩合并 1.概念 并查集&#xff1a;用于判断一对元素是否相连&#xff0c;它们的关系是动态添加&#xff08…

嵌入式学习笔记(20) SoC时钟系统简介

什么是时钟&#xff0c;SoC为什么需要时钟 &#xff08;1&#xff09;时钟同步工作系统的同步节拍 &#xff08;2&#xff09;SoC内部有很多器件&#xff0c;譬如CPU、DRAM控制器、串口、GPIO等内部外设&#xff0c;这些东西要彼此协调工作&#xff0c;需要一个同步的时钟系统…

解决css设置图片大小不生效的问题

今天在做css布局时发现一个问题&#xff1a;设置图片大小不生效&#xff1a; 如上图所示&#xff1a;左上角两个图标的大小不一致&#xff0c;第一个是56x56,第二个是49x49,所以要把第二个的高度设置成56px&#xff1a; .mi-home img {height: 56px; }但是如上代码&#xff0c;…

Java-钉钉订阅事件

文章目录 背景什么是钉钉订阅事件钉钉订阅事件的应用场景 整体思路查看钉钉文档 什么是钉钉回调钉钉回调具体实操创建自己的应用钉钉回调开发过程中遇到的问题 总结 背景 最近需要做一个业务&#xff1a;钉钉组织架构下添加人员之后&#xff0c;要对该人员的数据信息做一个处理…

mysql课堂笔记 mac

目录 启动mac上的mysql 进入mysql mac windows 创建数据库 创建表 修改字段数据类型 修改字段名 增加字段 删除字段 启动mac上的mysql sudo /usr/local/mysql/support-files/mysql.server start 直接输入你的开机密码即可。 编辑 进入mysql mac sudo /usr/local…

Revit SDK 介绍:MeasurePanelArea 统计分割表面中族的面积

前言 这个例子介绍如果从分割表面中&#xff0c;获取内部Tile&#xff08;或者Panel&#xff09;的族里面的几何实体的面的面积。 内容 本例子的逻辑相对来说比较简单&#xff0c;主要是对 DividedSurface 和 Element 的API接口要熟悉。 核心逻辑 设置单个面板Panel的面积上…

交友盲盒完整版——详细源码分享

现在目前比较火热的一款app交友盲盒是通过uniappspringboot技术来制作的&#xff0c;原理其实很简单&#xff0c;大家一看便知。 大家自行下载到手机里面去使用即可&#xff0c;不支持ios手机 演示地址&#xff1a;https://share.weiyun.com/l3ovztce 下面就是给大家分享源码了…

用Maloja创建音乐收听统计数据

什么是 Maloja &#xff1f; Maloja 是简单的自托管音乐记录数据库&#xff0c;用于创建个人收听统计数据。没有推荐&#xff0c;没有社交网络&#xff0c;没有废话。Maloja 是一个跟踪您一段时间内的收听习惯的工具。 官方演示站点&#xff1a;https://maloja.krateng.ch/ 导出…

一路风景一路歌 森海塞尔MKE 200为你记录City Walk的美妙旋律

“想要切身融入并感受一个地方的生活&#xff0c;不去当地街头溜达溜达怎么行&#xff1f;”一位City Walk Vlogger这样说。 City Walk可谓是时下最潮的生活方式之一了。不仅越来越多的游客开始穿梭于城市街巷&#xff0c;探寻饱含记忆的老建筑、老街区&#xff0c;从另一种角度…

Smallest number(dfs全排列)

Smallest number - 洛谷 #include<bits/stdc.h> #define int long long using namespace std; int a[10]; string s[5]; bool vis[10]; int ans1e13;//0x3f1e9&#xff0c;所有有点不够 void dfs(int u) { // for(int i0;i<4;i) // { // printf("%d…

Arouter配置指南

Arouter实现了大型App之间的轻耦合&#xff0c;降低代码的复杂度&#xff0c;易维护。如果不使用Arouter那么项目之前的关系可能是如下&#xff1a;底层模块间相互耦合&#xff0c;工程代码复杂度高&#xff0c;不便于管理。 Arouter 引入Arouter后希望底层模块间轻耦合&…

海南开放大学——助力学习之路的智慧导航

在信息时代的今天&#xff0c;我们面临着大量的学习资源和知识碎片化的挑战。而面对这一挑战&#xff0c;海南开放大学&#xff08;广播电视大学&#xff09;以其先进的教育理念和创新的学习方式&#xff0c;为学习者提供了一个独特的学习平台&#xff0c;开启了智慧导航的学习…

10路混音播放芯片,AD按键可扩展,IO口资源丰富,WTR096A-16S

随着科技的不断进步&#xff0c;我们的生活中对于音频体验的需求也在日益增加。无论是玩具、娱乐设备还是智能家居产品&#xff0c;都需要高性能、多功能的混音播放芯片来提供卓越的音频处理和控制能力。正是在这个背景下&#xff0c;我们引入了全新的WTR096A-16S混音芯片&…

房贷利率下调一言难尽

号外&#xff1a;9.7教链内参《摩根大通研究称BTC生产成本约为1.8w刀》。 一大清早&#xff0c;打开手机&#xff0c;就收到了新华社的推送&#xff0c;说是工农中建四大行7号发了公告&#xff0c;明确了存量首套住房贷款调整的事。&#xff08;新华社2023.9.8《四家银行发布公…

【新版】系统架构设计师 - 案例分析 - 总览

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 架构 - 案例分析 - 总览 新旧大纲对应 旧版新版系统规划软件架构设计设计模式系统设计系统建模分布式系统设计嵌入式系统设计系统的可靠性分析与设计系统的安全性和保密性设计系统计划信息系统架构的设计理论和实…

【观察】全栈智能:破解AI落地“最后一公里”难题

《系统论》认为&#xff1a;系统是由一些相互关联、相互作用、相互影响的组织部分构成并具有某些功能的整体。从系统的角度来看&#xff0c;如果把系统分解为部分&#xff0c;单独研究一个部分&#xff0c;就算把每个部分都研究清楚了&#xff0c;也回答不了系统整体性问题。 事…

C# 共享项目的应用

概述 共享项目也可以称为共享资产项目,它允许在多个目标项目之间共享的代码。 它支持编译器指令,可以有条件地包含特定于平台的代码,以便编译为引用共享项目的项目的子集。 还有 IDE 支持,可帮助管理编译器指令并直观显示代码在每个应用程序中的外观。 什么是共享项目? …

flink的物理DataFlow图及Slot处理槽任务分配

背景 在flink中&#xff0c;有几个比较重要的概念&#xff0c;逻辑DataFlow图&#xff0c;物理DataFlow图以及处理槽执行任务&#xff0c;本文就来讲解下这几个概念 概念详解 假设有以下代码&#xff1a;数据源和统计单词算子的并行度是2&#xff0c;数据汇算子的并行度是1&…

新知同享|Cloud 开发加速创新,更加安全

谷歌在云平台中深度集成了生成式 AI 功能 帮助出海企业及开发者 轻松借力 AI 推动和实现创新 一起来看 2023 Google 开发者大会上 Google Cloud 如何加速创新&#xff0c;加强信息安全 关注 Google Cloud 的 3 个 AI 重点发展领域 了解生成式 AI 功能如何助推创意落地 精彩大会…