C++多线程编程(第三章 案例1,使用互斥锁+ list模拟线程通信)
主线程和子线程进行list通信,要用到互斥锁,避免同时操作
1、封装线程基类XThread控制线程启动和停止;
2、模拟消息服务器线程,接收字符串消息,并模拟处理;
3、通过Unique_lock和mutex互斥方位list 消息队列
4、主线程定时发送消息给子线程;
代码包含了XThread类(基类)、XMsgSever类(消息)、测试主程序
//XThread.h 类(基类)
#pragma once
#include <thread>//基类
class XThread
{
public:virtual void Start();//启动线程virtual void Stop();//设置线程退出标志,并等待virtual void Wait();//等待virtual bool is_exit();//线程是否退出private:virtual void Main() = 0;//线程入口,纯虚函数,子函数必须单独实现bool is_exit_ = false;std::thread th_;};
//XThread.cpp 类(基类)
#include "XThread.h"using namespace std;//在CPP中引用using namespace
void XThread::Start()//启动线程
{is_exit_ = false;//不要退出th_ = thread(&XThread::Main,this);}
void XThread::Stop()//设置线程退出标志,并等待
{is_exit_ = true;Wait();}
void XThread::Wait()//等待
{if (th_.joinable()){th_.join();}}
bool XThread::is_exit()//线程是否退出
{return is_exit_;
}
//XMsgSever.h 类
#pragma once
#include "XThread.h"
#include <list>
#include <mutex>
class XMsgSever:public XThread
{
public://给当前线程发消息void SendMsg(std::string msg);private:void Main()override;//重写main,override检查名字是否写错std::list<std::string> msgs_;//消息队列缓冲std::mutex mux_;//互斥访问消息队列
};
//XMsgSever.cpp 类
#include "XMsgSever.h"
#include <iostream>using namespace std;void XMsgSever::SendMsg(std::string msg)
{//消息生产者unique_lock<mutex> lock(mux_);//为了保证list的线程安全,加锁msgs_.push_back(msg);
}void XMsgSever::Main()
{//消息消费者while (!is_exit()){this_thread::sleep_for(10ms);unique_lock<mutex> lock(mux_);if (msgs_.empty()){//如果没有消息,则continuecontinue;}while (!msgs_.empty()){//消息处理业务逻辑cout << "recv: " << msgs_.front().c_str() << endl;msgs_.pop_front();}}}
//测试主程序
/*1、封装线程基类XThread控制线程启动和停止;
2、模拟消息服务器线程,接收字符串消息,并模拟处理;
3、通过Unique_lock和mutex互斥方位list<string> 消息队列
4、主线程定时发送消息给子线程;*/#include "XMsgSever.h"
#include <sstream>
using namespace std;int main()
{XMsgSever server;server.Start();//启动子线程,调了Main入口,进入死循环消费信息了for (int i = 0; i < 10; i++){stringstream ss;ss << "msg: " << i + 1;server.SendMsg(ss.str());this_thread::sleep_for(500ms);}server.Stop();printf("All done!\n");return 0;
}
运行结果:

相关文章:
C++多线程编程(第三章 案例1,使用互斥锁+ list模拟线程通信)
主线程和子线程进行list通信,要用到互斥锁,避免同时操作 1、封装线程基类XThread控制线程启动和停止; 2、模拟消息服务器线程,接收字符串消息,并模拟处理; 3、通过Unique_lock和mutex互斥方位list 消息队列…...
IOS UICollectionView 设置cell大小不生效问题
代码设置flowLayout.itemSize 单元格并没有改变布局大小, 解决办法如下图:把View flow layout 的estimate size 设置为None,上面设置的itemSize 生效了。...
浅谈3D隐式表示(SDF,Occupancy field,NeRF)
本篇文章介绍了符号距离函数Signed Distance Funciton(SDF),占用场Occupancy Field,神经辐射场Neural Radiance Field(NeRF)的概念、联系与区别。 显式表示与隐式表示 三维空间的表示形式可以分为显式和隐式。 比较常用的显式表…...
软件测试技能大赛任务二单元测试试题
任务二 单元测试 执行代码测试 本部分按照要求,执行单元测试,编写java应用程序,按照要求的覆盖方法设计测试数据,使用JUnit框架编写测试类对程序代码进行测试,对测试执行结果进行截图,将相关代码和相关截…...
MybatisPlus拓展篇
文章目录 逻辑删除通用枚举字段类型处理器自动填充功能防全表更新与删除插件MybatisX快速开发插件插件安装逆向工程常见需求代码生成 乐观锁问题引入乐观锁的使用效果测试 代码生成器执行SQL分析打印多数据源 逻辑删除 逻辑删除的操作就是增加一个字段表示这个数据的状态&…...
设置k8s中节点node的ROLES值,K8S集群怎么修改node1的集群ROLES
设置k8s中节点node的ROLES值 1.查看集群 [rootk8s-master ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane,master 54d v1.23.8 k8s-node1 Ready <none> 54d v1.…...
【*1900 图论】CF1328 E
Problem - E - Codeforces 题意: 思路: 注意到题目的性质:满足条件的路径个数是极少的,因为每个点离路径的距离<1 先考虑一条链,那么直接就选最深那个点作为端点即可 为什么,因为我们需要遍历所有点…...
微信开发者工具 miniprogram_npm 未找到
背景 微信开发者工具中,打开集成了vant-weapp的项目,构建npm时,报错\miniprogram_npm\ 未找到。 问题 微信开发者工具,工具----->构建npm时,提示 message:发生错误 Error: D:\some\path\miniprogram…...
计算机视觉(三)未有深度学习之前
文章目录 图像分割基于阈值、基于边缘基于区域、基于图论 人脸检测Haar-like特征级联分类器 行人检测HOGSVMDPM 图像分割 把图像划分成若干互不相交的区域。经典的数字图像分割算法一般是基于灰度值的两个基本特征之一:不连续性和相似性。 基于阈值、基于边缘 基于…...
二十六、媒体查询2
目录: 媒体查询介绍网页常用分界点 一、媒体查询介绍 媒体特性: width 视口的宽度 height 视口的高度 一般设计的时候,高度不考虑,只考虑宽度 //当视口的宽度是500像素的时候,变颜色media (width: 500px) {body{background-colo…...
Themis 国库建设计划启动,开启去中心化新征程
在未来的金融领域,去中心化金融(DeFi)正在成为一种重要的趋势。在这股DeFi热潮中,作为Filecoin 生态下的一颗璀璨明珠,Themis 上线仅2个月,多项数据便稳居Filecoin-FVM榜首,TVL更是牢牢处于File…...
uni-app:模态框的实现(弹窗实现)
效果图 代码 标签 <template><view><!-- 按钮用于触发模态框的显示 --><button click"showModal true">显示模态框</button><!-- 模态框组件 --><view class"modal" v-if"showModal"><view cla…...
第九章:stack类
系列文章目录 文章目录 系列文章目录前言stack的介绍stack的使用成员函数使用stack 总结 前言 stack是容器适配器,底层封装了STL容器。 stack的介绍 stack的文档介绍 stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除…...
FSM:Full Surround Monodepth from Multiple Cameras
参考代码:None 介绍 深度估计任务作为基础环境感知任务,在基础上构建的3D感知才能更加准确,并且泛化能力更强。单目的自监督深度估计已经有MonoDepth、ManyDepth这些经典深度估计模型了,而这篇文章是对多目自监督深度估计进行探…...
idea 安装 插件jrebel 报错LS client not configured.
这个报错找了好久,有博主说版本不对,我脑子没反应过来以为是随便换一个低版本的就行,没想到只能是2022.4.1 这个版本才行 一定要用jrebel 2022.4.1的插件版本!!!!! 插件下载地址&…...
Raki的读paper小记:RWKV: Reinventing RNNs for the Transformer Era
Abstract&Introduction&Related Work 研究任务 基础模型架构已有方法和相关工作 RNN,CNN,Transformer稀疏注意力(Beltagy等人,2020年;Kitaev等人,2020年;Guo等人,2022年&am…...
PaddleOCR #PP-OCR常见异常扫雷
异常一:ModuleNotFoundError: No module named ‘tools.infer’ 实验案例: PaddleOCR #使用PaddleOCR进行光学字符识别(PP-OCR文本检测识别) 参考代码: 图片文本检测实验时,运行代码出现异常:M…...
Qt加载字体文件
本文记录如何使用 Qt 加载外部字体文件,并遍历字体名称和样式名称。 bool LoadFont(const QString& fontPath) {const int fontId QFontDatabase::addApplicationFont(fontPath);if (fontId -1) {return false;}// 遍历字体名和样式名 #if QT_VERSION > QT…...
3ds MAX绘制简单动画
建立一个长方体和茶壶: 在界面右下角点击时间配置: 这是动画制作的必要步骤 选择【自动】,接下来,我们只要在对应的帧改变窗口中图形的位置,就能自动记录该时刻的模样 这就意味着,我们通过电脑记录某几个…...
页面访问控制远程仓库
页面访问权限控制 什么是jwt身份认证 在前后端分离模式的开发中,服务器如何知道来访者的身份呢? 在登录后,服务器会响应给用户一个 令牌 (token)令牌中会包括该用户的id等唯一标识浏览器收到令牌后,自己…...
为什么你的DeepSeek总漏检重构后代码?4步反混淆预处理法(附LLM辅助去装饰器Python脚本)
更多请点击: https://codechina.net 第一章:DeepSeek代码重复检测 DeepSeek-R1 模型在训练过程中引入了严格的代码去重机制,其核心目标是消除训练语料中语义等价或高度相似的代码片段,从而提升模型对真实编程模式的学习能力与泛化…...
面试官问LinkedBlockingQueue和ArrayBlockingQueue区别?别只答有界无界了,这3个实战坑才是重点
面试官追问LinkedBlockingQueue与ArrayBlockingQueue?别只答基础区别,这3个实战陷阱才是关键 当面试官抛出"LinkedBlockingQueue和ArrayBlockingQueue有什么区别"这个问题时,80%的候选人会条件反射般回答"一个有界一个无界&qu…...
如何高效实现前端文件下载:FileSaver.js完整实用指南
如何高效实现前端文件下载:FileSaver.js完整实用指南 【免费下载链接】FileSaver.js An HTML5 saveAs() FileSaver implementation 项目地址: https://gitcode.com/gh_mirrors/fi/FileSaver.js FileSaver.js是一款轻量级的HTML5文件保存解决方案,…...
LaMa图像修复:用AI魔法轻松移除照片中的不想要元素
LaMa图像修复:用AI魔法轻松移除照片中的不想要元素 【免费下载链接】lama 🦙 LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WACV 2022 项目地址: https://gitcode.com/GitHub_Trending/la/lama 你…...
Lilishop:基于Spring Boot3的B2B2C开源商城系统全解析
引言在数字化转型浪潮席卷各行各业的今天,电商系统已成为企业拓展线上业务的核心基础设施。然而,从零构建一套功能完备、性能卓越、可扩展的商城系统,不仅需要投入大量研发资源,还面临技术选型、架构设计、安全合规等诸多挑战。开…...
June主题定制教程:从模板修改到样式定制的完整解决方案
June主题定制教程:从模板修改到样式定制的完整解决方案 【免费下载链接】june June is a forum (Deprecated) 项目地址: https://gitcode.com/gh_mirrors/ju/june June是一款开源论坛项目,通过本教程你将学习如何轻松定制June论坛的主题外观&…...
SSH协议深度解析:从加密隧道到生产级安全加固
1. 这不是“连服务器”的工具,而是现代数字信任的底层地基很多人第一次听说SSH,是在运维同事敲下ssh user192.168.1.100那刻——屏幕一闪,就进了另一台机器的命令行。于是顺理成章把它理解成“远程登录工具”。但这种认知,就像把高…...
别再硬啃C++了!用这个UE插件,5分钟让Web页面跑在虚幻引擎里
零代码整合Web与虚幻引擎:用WebUI插件打造数字孪生控制面板当Three.js的数据可视化大屏需要与UE5的工业场景联动,或是Vue构建的管理后台要嵌入数字孪生项目时,传统方案往往要求开发者同时精通前端框架和虚幻引擎蓝图系统。现在,通…...
你的音乐不该被格式绑架:用QMCDecode一键解锁QQ音乐加密文件
你的音乐不该被格式绑架:用QMCDecode一键解锁QQ音乐加密文件 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,…...
Hindsight核心概念解析:Retain、Recall、Reflect三大操作详解
Hindsight核心概念解析:Retain、Recall、Reflect三大操作详解 【免费下载链接】hindsight Hindsight: Agent Memory That Learns 项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight Hindsight是一款专注于AI智能体记忆管理的开源项目&…...
