C++的并发世界(九)——条件变量

news2024/11/26 9:45:42

0.绪论——单例模型

  单例设计模式是一种常见的设计模式,用于确保某个类只能创建一个实例。由于单例实例是全局唯一的。因此在多线程环境中使用单例模式时,需要考虑线程安全的问题。

1.消费者设计模式

在这里插入图片描述

2.condition_variable使用步骤

①准备好信号量

std::condition_variable cv;

②获取mutex
③获取mutex时修改数据
④释放锁并通知读取线程

lock.unlock();
cv.notify_one();
cv.notify_all();

3.读取共享变量的线程步骤

①获取与改变共享变量线程共同的mutex;
②等待信号通知 Wait()函数

4.condition_variable使用案例

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

std::list<std::string> message;
std::mutex mux;
std::condition_variable cv;

void ThreadWrite()
{
	for (int i = 0;; i++)
	{
		std::stringstream ss;
		ss << "Write msg" << i;
		std::unique_lock<std::mutex> lock(mux);
		message.push_back(ss.str());
		lock.unlock();
		cv.notify_one();//发送信号
		std::this_thread::sleep_for(std::chrono::seconds(100));
	}
}

void ThreadRead(int i)
{
	for (;;)
	{
		std::cout << "read msg:" << " [in] " << i <<std::endl;
		std::unique_lock<std::mutex> lock(mux);
		cv.wait(lock);//阻塞扽得改信号
	
		while (!message.empty())
		{
			std::cout << i << "read:" << message.front() << std::endl;
			message.pop_front();
		}
	}
}

int main()
{ 
	std::thread th(ThreadWrite);
	th.detach();

	for (int i = 0; i < 3; i++)
	{
		std::thread th(ThreadRead,i + 1);
		th.detach();
	}

	getchar();
	return 0;
}

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

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

相关文章

基于Spring Boot的旅游管理系统设计与实现

基于Spring Boot的旅游管理系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 旅游方案&#xff0c;用户通过旅游方案可以查看方案编号…

护眼台灯对眼睛有危害吗?比较好的台灯推荐

护眼台灯对眼睛有危害吗&#xff1f;我相信这应该是很多家长所关心的一件事&#xff0c;毕竟现在的孩子近视率实在太高了&#xff0c;而台灯作为夜晚学习不可或缺的一盏照明灯具&#xff0c;光源品质的好坏对眼睛的影响是非常大的&#xff01; 尤其是在这鱼龙混杂的台灯市场上…

Linux:Redis7.2.4的简单在线部署(1)

注意&#xff1a;我写的这个文章是以最快速的办法去搭建一个redis的基础环境&#xff0c;作用是为了做实验简单的练习&#xff0c;如果你想搭建一个相对稳定的redis去使用&#xff0c;可以看我下面这个文章 Linux&#xff1a;Redis7.2.4的源码包部署&#xff08;2&#xff09;-…

02—js数据类型及相互转换

一、数据类型 js把数据分为两类 基本类型&#xff1a;string number boolean undefined null 引用类型&#xff1a;object(fuction(可以执行) array&#xff08;数值下标&#xff0c;内部数据是有序的&#xff09;) 1.Number:数值类型&#xff0c;整数和小数 &#xff08…

【C#】 删除首/尾部字符

代码 static void Main(string[] args){string str "123abc";string strdelete "abc";string str1 str.Trim(1);string strc str1.Trim(c);string str11 str1.TrimStart(1);string strcc str1.TrimEnd(c);string strabc str.Trim(strdelete.ToCharA…

mysql8主从配置报错Authentication plugin ‘caching_sha2_password‘ reported error

错误信息&#xff1a; Error connecting to source slave192.168.2.177:3306. This was attempt 2/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin caching_sha2_password reported error: Authentication requires secure connection.…

连续6年!九州未来获评2024中国边缘计算企业20强

4月9日&#xff0c;由国内中立边缘计算领域研究平台——边缘计算社区策划发起的“2024中国边缘计算企业20强”榜单正式揭晓&#xff0c;九州未来凭借在边缘计算领域的深厚积累以及创新实践&#xff0c;从众多参评企业中脱颖而出&#xff0c;连续6年入选中国边缘计算企业20强&am…

RabbitMQ消息模型之Fanout消息模型

Fanout消息模型 * 广播模型&#xff1a;* 一个交换机绑定多个队列* 每个队列都有一个消费者* 每个消费者消费自己队列中的消息&#xff0c;每个队列的信息是一样的生产者 package com.example.demo02.mq.fanout;import com.example.demo02.mq.util.ConnectionUtils; impor…

Java区域基层卫生云联his系统源码 医院信息管理系统源码

基于云计算的医疗卫生信息系统(cloud-based healthcare informationsystem&#xff0c;简称“云 HIS”)是基于云计算技术&#xff0c;将医院信息系统、电子病历系统、实验室信息系统、公共卫生等系统横向集成的系统&#xff0c;为医疗机构信息化建设提供标准化、信息化、协同化…

Java中的TCP通信

TCP通信 TCP通信Socket客户端ServerSocket服务端 例子&#xff1a;一发一收例子&#xff1a;多发多收异常捕获 例子&#xff1a;服务器与多个客户端同时通信多客户端通信架构服务端代码ServerReaderThread 服务端读数据线程 TCP通信 特点&#xff1a;面向连接、可靠通信 通信双…

Git可视化工具 - 推荐

概述 Git版本管理工具是我们日常开发中常用的工具&#xff0c;熟练使用它可以提高我们的工作效率。 当然老司机基本使用命令行的方式进行操作&#xff0c;新手可借助可视化工具来进行过渡&#xff0c;命令行与可视化工具结合使用来加深对Git的熟悉程度。 下面推荐两个较受欢迎…

第七篇:3.6 其他评估考虑/4.审计指南/5. 通用报告规范/6.披露指南、参考标准及其他 - IAB/MRC及《增强现实广告效果测量指南1.0》

翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇广告效果测量定义和其他矩阵之- 3.2 可见性 &#xff08;Viewability&#xff09;第四篇 …

Flask基于flask_login实现登录、验证码

flask_login 是一个 Flask 扩展&#xff0c;用于在 Flask web 应用中实现用户会话管理。它允许你跟踪哪些用户已经登录&#xff0c;并管理他们的登录状态。flask_login 提供了用户认证的基础结构&#xff0c;但具体的用户验证&#xff08;如用户名和密码检查&#xff09;和存储…

DAY03|203.移除链表元素、707.设计链表、206.反转链表

203.移除链表元素、707.设计链表、206.反转链表 LeetCode 203.移除链表元素LeetCode 707.设计链表LeetCode 206.反转链表双指针法递归法 LeetCode 203.移除链表元素 注意&#xff0c;在dummy上操作&#xff0c;返回也返回dummy->next 如果头铁想返回head&#xff0c;那样会…

Redis入门到通关之Redis介绍

文章目录 1.Redis简单介绍1.1 非关系型数据库介绍 2.本文介绍如下内容3.初始Redis3.1.认识NoSQL3.1.3.查询方式3.1.4.事务3.1.5.总结 3.2.认识Redis3.3 安装Redis 1.Redis简单介绍 Redis是一种键值型的 NoSql 数据库&#xff0c;这里有两个关键字&#xff1a; 键值型NoSql 其…

负荷预测 | Matlab基于TCN-LSTM-Attention单输入单输出时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.负荷预测 | Matlab基于TCN-LSTM-Attention单输入单输出时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行…

C++算法 —— 回溯(二)

一、字母大小写全排列 1.链接 784. 字母大小写全排列 - 力扣&#xff08;LeetCode&#xff09; 2.描述 3.思路 首先&#xff0c;根据题意&#xff0c;这是一个不能重复的全排列&#xff0c;并且根据特定的规则&#xff0c;我们需要分三种情况&#xff0c;一种是当字符为数字…

Android源码解析之截屏事件流程

今天这篇文章我们主要讲一下Android系统中的截屏事件处理流程。用过android系统手机的同学应该都知道&#xff0c;一般的android手机按下音量减少键和电源按键就会触发截屏事件&#xff08;国内定制机做个修改的这里就不做考虑了&#xff09;。那么这里的截屏事件是如何触发的呢…

基于spring boot的班级综合测评管理系统

基于spring boot的班级综合测评管理系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开…

Linux进阶篇:linux操作系统一个神奇的分区:swap交换分区

linux操作系统一个神奇的分区&#xff1a;swap交换分区 1 Swap交换分区概念 Linux内核为了提高读写效率与速度&#xff0c;会将文件在内存中进行缓存&#xff0c;这部分内存就是Cache Memory(缓存内存)。即使你的程序运行结束后&#xff0c;Cache Memory也不会自动释放。这就…