C++11多线程(5)

基于QT的多线程管理机制 目标 本文章基于QT5 c++11的多线程机制,尝试构造一种能够批量新建、关联管理、状态反馈、有序退出的服务模式 类设计 1、多线程服务类ThreadService,承担线程外部对接操作;调用线程初始化操作;装载线程所需数据;调用线程销毁操作;接收线程信号并新建、销毁线程管理队列功能,是外部功能的对接接口和内部线程组的管理模块。 2、线程功能基类,负责实现线程的基础功能,如启动线程运行返回线程开始信号、结束线程销毁装载数据并返回结束信号、记录线程id和线程组关联关系(比如一个操作的多个关联线程称为一个线 阅读详情

原子操作

我们之前可以通过mutex(互斥量)来给线程加锁,达到我们保护数据和操作的完整性,现在我们还可以用原子操作来保证我们的数据和操作的完整性(当然,mutex锁更好用)。

atomic

atomic是一个类模板,在atomic头文件中,用来封装某个类型的值。

#include <iostream>
#include <thread>
#include <atomic>

using namespace std;

atomic<int> v_atomic = 0;

void my_thread1(){
	for(int i = 0;i < 1000;++i){
		++v_atomic;		//对应操作是原子操作,不会被打断
	}
}
void my_thread2(){
	for(int i = 0;i < 1000;++i){
		v_atomic = v_atomic + 1;		//非原子操作,在汇编中会翻译成几句
	}
}

int main(){
	thread my_th1(my_thread1);
	thread my_th2(my_thread1);
	my_th1.join();
	my_th2.join();
	cout << "最终结果是"  << v_atomic1 << endl;
	thread my_th3(my_thread2);
 	thread my_th4(my_thread2);
 	my_th3.join();
 	my_th4.join();
 	cout << "最终结果是"  << v_atomic2 - 2000 << endl;
	return 0;
}

运行结果:
运行结果

过程浅析

在上面,我们用atomic创建了一个原子对象,它能保证对一个变量的操作不会被其他的线程操作覆盖,但它本身也要求对原子对象所作的操作要保持原子性,上面两个相同的线程调用类似操作,但结果截然不同,就是因为v_atomic = v_atomic + 1;的操作是非原子性的。

一般原子操作

针对(++)(–)(+=)(-=)(&=)(|=)(^=)是支持的。
对于其他的操作可能并不支持。

总结

它可以一定程度上保证我们操作的原子性,但是它的局限也比较大,它的一般应用场景为:统计或者计数。

volatile 与 atomic 深度对比:C++11/17/20 多线程数据同步的5个误区 本文深入对比了C++多线程编程中`volatile`与`std::atomic`的差异,揭示了5个常见误区,包括原子性、内存可见性和指令重排等问题。通过实际代码示例和性能分析,帮助开发者正确使用C++11/17/20的内存模型,提升多线程数据同步的效率和安全性。 阅读详情

相关推荐

西门子RS485自由口通信Modbus RTU 通信协议

部分西门子的RS485模块不能使用西门子自带的Modbus RTU通信指令,需要通过自己拼接、发送、接收和解析报文完成Modbus RTU通信。通过多次尝试完成该功能: #R_TRIG_Instance(CLK := #触发, Q => #触发上升沿); IF #触发上升沿 THEN // 触发后先将读取完成复位 #读写完成 := 0; END_IF; CASE #功能码 OF 1: // 线圈状态读取 ; 2:

qq_20792765的博客 1万+

C++11并发与多线程笔记(5)

C++11并发与多线程笔记(5)condition_variable、wait、notify_one、notify_all条件变量std::condition_variable、wait、notify_one上述代码深入思考notify_all()async、future、packaged_task、promisestd::async、std::future创建后台任务并返回值std::packaged_taskstd::promise小结 condition_variable、wait、notify_on

qq_41855185的博客 620

从零到一:STM32CubeMX虚拟串口开发中的常见陷阱与优化策略

本文深入探讨了STM32CubeMX在USB虚拟串口开发中的常见问题与优化策略,涵盖数据流吞吐量瓶颈、实时性约束等核心挑战。通过实战案例和代码示例,详细解析了波特率同步异常、数据丢失等问题的解决方案,并提供了DMA配置和中断优先级调优的高级技巧,帮助开发者提升STM32虚拟串口的性能和可靠性。

weixin_29164185的博客 370

c++11 多线程5

当 std::condition_variable 对象的某个 wait 函数被调用的时候,它使用 std::unique_lock(通过 std::mutex) 来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。 std::condition_variable 对象通常

Jarvis的博客 390

告别软件轮询!用STM32G474的COMP比较器实现纳秒级硬件过压保护(CubeMX配置详解)

本文详细介绍了如何利用STM32G474的COMP比较器实现纳秒级硬件过压保护,通过CubeMX配置详解,展示了硬件比较器相比传统软件轮询方案在响应时间、CPU占用和可靠性等方面的显著优势。文章还提供了实战配置流程和优化技巧,帮助工程师快速构建高效的硬件保护系统。

weixin_28683689的博客 351

飞书应用开发脚手架lark-harness:从零构建企业级机器人

在构建企业级应用时,开发脚手架是提升工程效率和规范性的关键工具。其核心原理在于通过预设的项目模板、最佳实践和通用模块封装,自动化处理项目初始化、配置管理和基础架构搭建。这种技术价值在于将开发者从重复性劳动中解放出来,确保团队技术栈统一,并降低维护成本。在Node.js生态中,脚手架常与Express或Koa等Web框架结合,用于快速构建Web服务、API接口和实时事件处理系统。具体到飞书开放平台开发场景,开发者需要处理OAuth 2.0授权、事件订阅验证、消息加解密等复杂且标准的流程。lark-harnes

weixin_30703911的博客 612

【C++11多线程与并发编程】 (5) 读写锁

介绍C++的读写锁

小雨的分享斋 570

时间序列数据预测——15种时序大模型

本文综述了时间序列大模型(TSFM)的最新进展,系统介绍了11种主流模型(如TimeGPT、Lag-Llama、Moirai等)的架构特点、训练数据和创新点,并对比分析了它们在单变量/多变量预测、概率预测等功能上的差异。研究表明,基于"大规模预训练-微调/零样本"范式的TSFM在标准数据集(如M4、ETT)上展现出优于传统方法的性能,Time-MoE等模型更达到SOTA水平。但TSFM仍面临计算成本高、可解释性差等挑战,未来发展方向包括轻量级架构、多模态融合和可解释性增强。

m0_56592100的博客 4069

C++11新特性5:多线程、互斥锁、条件变量、原子类型

C++11新特性5:多线程、互斥锁、条件变量、原子类型

720

镜像电流源与比例电流源:原理、应用与性能优化

本文深入解析了镜像电流源与比例电流源的工作原理、核心应用与性能优化方法。镜像电流源利用匹配晶体管实现电流复制,是集成电路的基础;比例电流源通过发射极电阻实现电流缩放,应用更灵活。文章重点探讨了其作为有源负载提升放大器增益的关键应用,并分析了静态误差、输出阻抗和最小工作电压三大性能指标,最后介绍了威尔逊电流镜等进阶优化技术及实战设计要点。

dd012的博客 567

基于深度学习的灰度图像气泡群识别与优化

灰度图像气泡群深度学习识别优化研究 本研究针对MATLAB实现的深度学习气泡群识别系统在从1445个点到4992个点扩展时出现的精度不稳定问题,提出了一套完整的解决方案。文章首先分析了问题根源,包括数据复杂度增加、类别不平衡、网络容量不足等因素,然后系统性地提出了数据预处理增强、网络架构优化、训练策略调整和后处理算法改进等优化措施。通过改进的U-Net架构、自适应直方图均衡化等技术创新,有效提升了模型在大规模气泡群图像上的识别精度和稳定性,为化工、生物医学等领域的灰度图像分析提供了可靠的技术支持。

max500600的博客 412

C++11新特性(5):多线程

自旋锁是一种忙等待形式的锁,会在用户态不停的询问锁是否可以获取(获取不到一直循环),不会陷入到内核态中,所以更加高效,但是可能会对CPU资源造成浪费。这样,在lambda表达式执行结束后,变量a已经被销毁,但后台运行的线程仍然在使用已销毁变量a的指针,因此后面输出的值都是错误的。条件变量需要和互斥量配合使用,属于另一种用于等待的同步机制,能阻塞一个或多个线程,直到收到另一个线程发出的通知或超时时,才能唤醒当前阻塞的线程。std::async是基于任务的,内部有调度器,比线程更高级别的抽象,可以看作是。

myepicure的专栏 287

蓝牙功耗优化实战:连接蓝牙耳机时高耗电问题的深度排查与解决

连接任意一款蓝牙耳机, 进行插入实网SIM卡, 同时连接蓝牙耳机后, 进入IDLE模式, 测试时间为10分钟的测试结果, 平均电流毫安在8左右. 测试结果1: 平均电流 8.84mA 测试结果2: 平均电流 7.39mA 厘清问题: 由于出现上两幅图中 绿色线圈中的 20mA 左右高耗电时段, 从而将整体的平均电流抬高. 于是在记录IDLE下电流出现绿色线圈中的 20mA 左右高耗电时段, 同时录制UART1 Catcher log. Filter: MOD_BT/MOD_ATC.

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1001

《C++11标准库》4.5并发与多线程(概述)

在C++11之前,语言本身和C++标准并不支持并发,虽然编译器可以实现并对此提供某种支持。但在C++11中,不论是内核语言还是标准库都加强支持并发编程。 以下内容适用于内核语言: *如今具备了这样一个内存模型,保证当你修改“被不同的两个线程使用的”两个不同对象时,它们彼此独立。在C++11之前,并不保证“某一线程涂写一个 char “不会干涉”另一线程涂写另一个char“。 *引入一个新关键字 thread_local,用来定义”线程特定“的变量和对象。 标准库提供以下特性: *若干线程安全相关的

weixin_60351940的博客 400

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Strapi 异步工具集详解:@strapi/utils 中 async.map / async.reduce / async.pipe 的实现原理与实战

本文基于 Strapi 核心文档 [Async utils functions](https://link.gitcode.com/i/1e973e800cd0fb43ce4f41a509b7a20c),系统讲解 `@strapi/utils` 包中 `async` 命名空间提供的三个工具函数——`map`、`reduce` 与 `pipe` 的 API 用法、源码实现与测试行为。读完本文,你将能

gitblog_00256的博客 779

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

c++11多线程并发编程学习(5)---创建多线程

一.创建多个线程: 1 #include<iostream> 2 #include<thread> 3 #include<unistd.h> 4 #include<vector> 5 using namespace std; 6 7 void fun(int i) //线程运行函数 8 { 9 cout&...

KingOfMyHeart的博客 374

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++11多线程编程 5.互斥量概念、用法、死锁演示及解决详解

#include<iostream> #include<thread> #include<vector> #include<string> #include<mutex> #include<list> using namespace std; class A { public: //把收到的消息(玩家命令)入到一个队列的线程。 void inMsgRecvQueue() { for (int i = 0;...

guonengneng的博客 250

C++11并发与多线程笔记(5)互斥量概念、用法、死锁演示及解决详解

C++11并发与多线程笔记(5)互斥量概念、用法、死锁演示及解决详解

Lakers 280

Qt5 C++ 多线程工业气体标定实战

Qt5 C++ 多线程工业气体标定1)使用OPC 封装COM2)C++调用OPC;3)使用经典界面;4)使用QT专业皮肤编程qss;5)C++链接PLC读写数据;6)KEPSVR服务器;参数如下:1)编程语言:C++ (11或以上);2)编程环境:QT5.14;3)编程工具1:qss;4)编译器:msvc;(没有就完整安装2019,一定要选msvc,或安装 WIN10 SDK)5)数据库:access, mysql, sqlserver;

hlABgYML的博客 1927

c++11:多线程编程(5)生产消费者模型之条件变量

当某个线程持有这把锁的时候(就是所谓的加锁),那么这个线程是独占所有的资源,这里的资源指的是执行的权限,其他要抢夺资源的线程都不得不等待。在很多情况下,这都容易适用,但是有些情况下,却会产生一些异常情况。 在生产消费者模型当中,肯定都会用到互斥锁的机制的,当生产者往队列中放数据的瞬间,消费者是不能取数据的,那这时候可能会碰见一个问题,如果生产者因为某些原因,放数据过慢,但是消费者取数据很快,当队列中没有数据了,消费者还去取的话,就会发生异常情况。有些人可能会说,加个条件判断一下队列是否为空...

努力努力努力 360

在 imx6q 的ARM板上运行c++11以及一些posix接口代码

1. 说明 硬件环境: 迅为imx6q开发板, ARM Cortex-A9的处理器 7.0寸电容触摸屏软件环境: 使用的是迅为官方提供的u-boot.imx , uImage, Qt5.7的rootfs根文件系统 问题: 在使用迅为提供的Qt5.7的系统时,发现板子的动态库不支持c++ 的东西,只支持Qt,于是就开始了找原因的过程。 下面是在迅为提供的Qt5.7的系统上执行c++的报错问题: 找不到动态库 GLIBCXX_3.4.11 通过执行strings /lib/libstdc++..

qq_27726651的博客 1012
上一篇: C++11多线程(4)
下一篇: MySQL基本指令
binary str
博客等级 码龄8年 18粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值