C++ 并发编程指南(10)线程间通信

C++ 多线程之间的通信方式(windows下实现) 最近学习了C++ 多线程之间的通信方式,记录一下。 参考原文:https://blog.youkuaiyun.com/eulb/article/details/2177500 C++线程的通信方式有很多种,这里记录一下常用的几种: 1.全局变量 2.互斥量 3.信号量 4.事件 5.临界区 1.全局变量 通过全局变量进行通信,要对该变量加关键字volatile volatile(易变的):每... 阅读详情
AI摘要

本文详细探讨了C++中线程间通信的各种方法,包括共享内存、消息队列、管道、条件变量和信号量,以及它们在解决数据竞争和同步问题中的作用。同时强调了线程通信与同步的区别和联系。


前言

在多线程编程中,线程间通信(Inter-Thread Communication,简称ITC)是不可或缺的一部分,它使得不同的线程能够交换信息、协作完成任务。C++作为一种功能强大的编程语言,提供了多种机制来实现线程间的通信。下面我们将详细讨论这些机制。

一、线程间通信

1、共享内存

共享内存是最直接也是最常见的线程间通信方式。在C++中,全局变量、静态变量以及堆上分配的对象都可以被多个线程访问。这些变量在内存中的位置是固定的,因此多个线程可以通过指针或引用来访问和修改它们。

然而,共享内存也带来了同步问题。如果没有适当的同步机制,多个线程可能会同时读写同一个变量,导致数据竞争和不一致的结果。为了解决这个问题,C++提供了多种同步原语,如互斥锁、条件变量、以及读写锁等。这些同步原语可以确保在某一时刻只有一个线程访问共享变量,从而避免数据竞争。例如,使用std::mutex可以保护对共享变量的访问:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx; // 全局互斥锁
int shared_data = 0; // 共享数据

void increment() {
   
   
    for (int i = 0; i < 10000; ++i) {
   
   
        std::lock_guard<std::mutex> lock(mtx); // 使用锁保护区域
        ++shared_data;
    }
}

int main() {
   
   
    std::thread t1(increment);
    std::thread t2(increment);
    
    t1.join();
    t2.join();
    
    std::cout << "Shared data: " << shared_data << std::endl; // 输出应为20000
    return 0;
}

2、消息队列和管道

除了共享内存外,还可以使用消息队列和管道来实现线程间的通信。这些机制允许线程通过发送和接收消息来交换信息,而不是直接操作共享内存。虽然C++标准库没有直接提供消息队列和管道的实现,但开发者可以使用第三方库或自定义数据结构来实现这些功能。例如,可以使用标准库中的std::queue和条件变量来实现一个简单的消息队列:

#include <iostream>
#include <thread>
#include 
线程是如何通讯的? 线程通讯指的是多个线程之间通过共享内存或消息传递等方式来协调和同步它们的执行。在多线程编程中,通常会出现多个线程需要共同完成某个任务的情况,这时就需要线程之间进行通讯,以保证任务能够顺利地执行。线程通讯的实现方式主要有以下两种:共享内存:多个线程可以访问同一个共享内存区域,通过读取和写入内存中的数据来进行通讯和同步。消息传递:多个线程之间通过消息队列、管道、信号量等机制来传递信息和同步状态。 阅读详情

相关推荐

C++ 九阴真经之线程间通信(消息队列)

消息队列是线程间通信比较常用得方式,常用于解决经典模型生产者——消费者模型线程间得通信。 本文将结束基于C++标准库实现得消息队列,可以支持任意参数类型,任务参数数量。 为了方便后续线程池、异步队列得实现,这里提取了公共基类。 class QueueObject : public noncopyable { public: QueueObject() :m_bStop(false), m_nCapacity(MAX_QUEUE_CAPACITY) { } virtual ~QueueO

零落年华的专栏 3319

C++ 并发编程实战:5种线程间通信机制深度解析

本文深度解析了C++并发编程中五种核心的线程间通信机制,包括共享内存、消息队列、条件变量、信号量以及原子操作与future/promise。文章通过代码示例对比了各自的优缺点与适用场景,旨在帮助开发者根据实际需求选择最合适的通信方式,以构建正确且高效的多线程程序。

wind6的博客 217

【5】c++多线程技术之线程间通信

线程间通信是多线程编程中的一个重要概念,它指的是在一个程序中的多个线程之间传递信息或者同步执行的过程。在C++中,有多种方式可以实现线程间的通信。

以道御术 700

LabVIEW调用.so文件的方法

LabVIEW调用.so文件的方法

m0_37878912的博客 3024

硬件工程师的蜗牛成长路

1、《模拟电路课程》R/L/C/继电器/光耦/二极管/三极管/MOS管磁珠/ESD/TVS/肖特基二极管/稳压二极管/保险丝/GDT/TSS/光耦/MOS/运放/BJT比较器/面板开关/按键开关/拨码开关/BUCK/LDO/电源防护器件LM5069单输出PLL/多路输出PLL/单端晶振/差分晶振/晶体(这方面不熟悉,待以后补充)1)速度传感器2)温度传感器3)倾斜角传感器4)火焰传感器5)红外传感器6)呼吸心跳采集chaunganqi1)数字隔离 电平转换芯片/磁隔离/专用隔离芯片。

caozhaokun的博客 1979

CH592F RISC-V蓝牙LED灯设计:WS2812B驱动与微信小程序控制

蓝牙低功耗(BLE)是嵌入式物联网设备主流无线通信技术,其核心在于协议栈轻量化、射频稳定性与外设协同调度。基于RISC-V内核的蓝牙SoC(如CH592F)凭借高集成度、低待机电流和免外部巴伦的射频设计,显著降低硬件复杂度与BOM成本;而WS2812B作为单线级联RGB LED,依赖微秒级精准时序,需借助定时器+DMA机制规避CPU干预,保障动态效果流畅性。该方案融合电容触摸交互、GATT服务自定义与微信小程序标准Bluetooth API对接,适用于智能照明、DIY彩灯及教学实践等场景,是BLE+LED实

weixin_31163455的博客 433

给IC设计新人的Tessent Scan入门指南:从RTL到ATPG的完整DFT流程解析

本文为IC设计新手提供Tessent Scan的完整DFT流程指南,从RTL代码检查到ATPG测试向量生成,详细解析扫描链配置、插入及验证的关键步骤。通过实战案例和工具命令示例,帮助工程师快速掌握Tessent工具链的应用技巧,提升芯片可测试性设计的效率和质量。

weixin_32541663的博客 451

使用Xpath语法爬取豆瓣读书Top250

使用Xpath语法爬取豆瓣读书Top250 使用的软件是Spyder 网页地址:https://book.douban.com/top250?start=0 直接上代码: # -*- coding: utf-8 -*- """ Created on Thu Apr 30 18:35:17 2020 @author: ASUS """ import requests import csv fr...

weixin_43987253的博客 2081

tkinter动态表格 - 实时更新数据(TkinterTable)

tkinter动态表格 - 实时更新数据(TkinterTable) 参考 [TkinterTable] Tkinter上的表格GUI】 https://github.com/dmnfarrell/tkintertable/wiki/Usage https://github.com/dmnfarrell/tkintertable/issues/47 python使用tkinter编写一个数据显示窗口(实时显示更新的数据) 首先安装TkinterTable,即pip install tki

qq_33934427的博客 1万+

STM32G070xx将Flash页分块方式存储,固定数据块存储,实现一次擦除多次写入

本例程使用STM32G070xx芯片,Flash大小128KB,Flash每页(2048字节)写满后再擦除。操作存储区分为64块,每块32字节,即写满64次擦除一次;标定存储区分为16块,每块128字节,即写满16次擦除一次,每个存储区的块都有各自的头部标记

RaphaelCeo的博客 1545

【嵌入式DIY实例ESP32篇】-步数计数器

在本项目中,我们将使用 ESP32 微控制器和博世的 BMI160 加速度计陀螺仪模块构建一款便携式计步器

视觉与物联智能 803

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Camera2Demo

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

上一篇: C++ 并发编程指南(9)条件变量
下一篇: C++ 基础组件(1)定时器
一个不务正业的程序猿
博客等级 码龄11年 1879粉丝 563原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值