C++中的进程和线程的通信交互

一.死锁的问题

原因:多个进程或线程共享资源造成的一种僵持状态:1.竞争系统资源;2.进程的推进顺序不当;
产生的必要条件:1.互斥条件;2.请求和保持条件;3.不可剥夺条件;4.环路等待条件;
解决死锁:
预防死锁:通过有序的资源配置,足够的资源分配;
解决死锁:强行剥夺资源;撤销进程等;

二.线程间通信

1.通信方式

信号槽通信
Qt特有的通信方式,可在类之间,线程之间进行信息交互或通信
共享变量
最常用的方式,对于一些全局变量,多个线程同时操作,需要用原子变量或者用互斥锁临界区等多线程同步解决线程安全问题
自定义消息
借助于windows程序的消息通信机制,当两个线程之间至少有一个为UI线程,那么就可以直接通过SendMessage或者PostMessage来发送消息到指定线程进行响应。这种方法涉及到线程的切换,如果SendMessage/PostMessage指定的窗口是由调用线程创建,那么就是一个普通的子程序;如果指定窗口由另一个线程创建,也即UI线程,那么系统会挂起当前工作线程,切换到ui线程,并调用合适的窗口过程(PostMessage则直接进消息队列)
promise、future语法
promise对象通过promise.get_future()函数和future对象联系起来,promise对象通过set_value设置值,而future对象通过get获取值。这在两个不同线程内也可以执行。在get没有获取值值之前该线程被阻塞。这里的T是任意类

2.通信安全

(1)临界区
通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。EnterCriticalSection() 进入临界区,LeaveCriticalSection() 离开临界区,EnterCriticalSection()
(2)互斥锁
为协调共同对一个共享资源的单独访问而设计,互斥量跟临界区很相似,只有拥有互斥对象的线程才具有访问资源的权限,由于互斥对象只有一个,所以任何情况下此共享资源都不会同时被多个线程所访问。互斥量比临界区复杂。因为使用互斥不仅可以在多线程中实现资源的安全共享,而且可以在不同多进程之间实现对资源的安全共享。CreateMutex() 创建一个互斥量,OpenMutex() 打开一个互斥量,ReleaseMutex() 释放互斥量,WaitForMultipleObjects() 等待互斥量对象
(3)原子变量
通过原子操作给原子类型指定bool、char、int、long、指针等类型作为模板参数,原子是不可被CPU上下文交换的机器指令,这些指令组合在一起就形成了原子操作。在多核CPU下,当某个CPU核心开始运行原子操作时,会先暂停其它CPU内核对百年来所在内存的操作,以保证原子操作不会被其它CPU内核所干扰,其内部使用CAS循环,所以无需加锁即可实现线程安全。
(4)信号量
信号量对象对线程的同步方式互斥锁临界区等方法不同,信号允许多个线程同时使用共享资源 ,只限制访问共享资源的线程最大数目。信号量操作函数:CreateSemaphore() 创建一个信号量,OpenSemaphore() 打开一个信号量,ReleaseSemaphore() 释放信号量,WaitForSingleObject() 等待信号量
事件Event
事件对象也可以通过通知操作的方式来保持线程的同步。并且可以实现不同进程中的线程同步操作。事件的几个函数:CreateEvent() 创建一个事件,OpenEvent() 打开一个事件,SetEvent() 回置事件,WaitForSingleObject() 等待一个事件
join函数
通过C++11新特性的join函数来进行线程的流程控制管理,对线程进行阻塞,确保线程安全

3.Qt中多线程使用

创建继承自Qthread的子类,重写父类的Run方法,实现子线程要处理的业务,再用start启动方法。优点:代码实现简单,但在一个子线程中处理多个任务,所有的处理逻辑都需要写到run()函数中,这样该函数中的处理逻辑就会变得非常混乱,不太容易维护
从QObject派生一个普通的工作类,添加成员函数来实现子线程要处理的业务逻辑,在主线程中创建QThread对象,和前面的工作类对象,通过moveToThread()将工作对象移动到创建的子线程对象中,调用start()启动子线程,最后手动调用工作类对象的对应函数即可真正在让其在子线程中执行。优点:可以创建多个类似的工作类,将各自的业务流程作为成员函数,然后将这个业务类的实例对象移动到对应的子线程中moveToThread()就可以了,这样可以让编写的程序更加灵活。
使用Qt的线程池,线程池其实由三部分组成:任务队列,工作的线程,管理者线程。Qt中的 QThreadPool 类管理了一组 QThreads, 里边还维护了一个任务队列。QThreadPool 管理和回收各个 QThread 对象,以帮助减少使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局 QThreadPool 对象,可以通过调用 globalInstance() 来访问它。也可以单独创建一个 QThreadPool 对象使用

4.VS中多线程使用

MFC中使用AfxBeginThread来创建线程,该函数使用完后会自动释放掉线程句柄
WinAPI中使用CreateThread来创建线程,CreateThread 和CloseHandle是成对的,程序是不会自动释放线程句柄。在不用时需要调用CloseHandle函数释放线程句柄
C++11中的std::thread线程类,实现多线程,其构造函数会立即启动线程,并且线程的生命周期与std::thread对象绑定。因此,在使用std::thread时,不需要显式调用类似"start"的方法

三.进程间通信

1.通信方式

(1)共享文件模式
通过多个进程共同读写同一个文件来实现通信,如管理多个进程的配置文件CFile的read(),write()
(2)映射文件模式
通过两个或多个进程映射同一个文件映射对象的视图来实现的,CreateFileMapping(),OpenFileMapping(),MapViewOfFile(),UnmapViewOfFile();
(3)共享内存模式
通过多个进程来调用操作原始内存的模式实现,ReadProcessMemory()和WriteProcessMemory()
(4)管道方式
管道是半双工模式,效率差。匿名管道:是不命名的,它主要用于单机版的本地系统中父进程与它启动的子进程之间的通信。命名管道则高级一些,通过一个名字进行标识,使客户端和服务端应用程序能够通过该管道进行通信。命名管道能够在不同系统的进程间使用,这使它成为许多客户/服务器应用程序的理想之选。CreateNamedPipe(),ConnectNamedPipe(),CreateEvent(),WriteFile().
(5)消息方式
消息是利用Windows的驱动机制进行进程通信,就是使用消息激活某种操作的过程。对于进程间的通信,有用户自定义的消息和Windows消息,适合少量数据的频繁通信,根据定义的消息号用SendMessage发送
(6)信号量
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源,Linux下定义了多种信号量,使用比较常见
(7)套接字socket
socket是最常见的进程间通信方式,尤其是跨网络情况下,常见的客户端/服务器模式就是典型的跨网络进程交互,通过三次握手四次挥手实现安全的通信

2.通信安全

(1)加join,使其变为串行
(2)使用互斥锁确保进程间安全的访问共享资源,互斥锁既可用于线程也可用于进程

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

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

相关文章

【音视频 | RTSP】RTSP协议详解 及 抓包例子解析(详细而不赘述)

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命

华为开发者大会2024纪要:鸿蒙OS的全新篇章与AI大模型的革命 在科技的浪潮中,华为再次引领潮流,2024年的开发者大会带来了一系列令人瞩目的创新成果。从鸿蒙操作系统的全新Beta版到盘古大模型的震撼发布,华为正以前所未有的速度重塑智能生态。以下是本次大会的亮点,让我们…

MUNIK解读ISO26262--系统架构

功能安全之系统阶段-系统架构 我们来浅析下功能安全系统阶段重要话题——“系统架构” 目录概览: 系统架构的作用系统架构类型系统架构层级的相关安全机制梳理 1.系统架构的作用 架构的思维包括抽象思维、分层思维、结构化思维和演化思维。通过将复杂系统分解…

哨兵1SAR空间数据包协议数据单元文档(七)

《哨兵1SAR空间数据包协议数据单元》文档对数据包的结构进行了详细描述,并提供了用户数据的格式和解码算法。 原文链接: 哨兵1SAR空间数据包协议数据单元文档英文版 同系列中的其他文章篇链接: 哨兵1SAR空间数据包协议数据单元文档(一) 哨兵…

lodash-es 基本使用

中文文档:https://www.lodashjs.com/ cloneDeep方法文档:https://www.lodashjs.com/docs/lodash.cloneDeep#_clonedeepvalue 参考掘金文章:https://juejin.cn/post/7354940462061715497 安装: pnpm install lodash-esnpm地址&a…

Javase-异常

文章目录 1. 异常概述2. 异常的继承结构3. 自定义异常4. 异常的处理5. 异常的使用6. finally语句块7. 方法覆盖与异常 1. 异常概述 什么是异常 ①什么是异常?有什么用? 1.Java中的异常是指程序运行时出现了错误或异常情况,导致程序无法继续正常执行的现象。例如&…

谷粒商城 - 树形菜单递归流查询、三级分类数据查询性能优化、Jmter 性能压测

目录 树形分类菜单(递归查询,强扩展) 1)需求 2)数据库表设计 3)实现 4)关于 asSequence 优化 性能压测 1)Jmeter 安装使用说明 2)中间件对性能的影响 三级分类数…

【Kubernetes】Pod 资源调度之亲和性调度

Pod 资源调度之亲和性调度 1.Node 亲和性调度1.1 Node 硬亲和性1.2 Node 软亲和性 2.Pod 亲和性调度2.1 Pod 硬亲和2.2 Pod 软亲和2.3 Pod 反亲和 Kubernetes 的 默认调度器 以 预选、优选、选定机制 完成将每个新的 Pod 资源绑定至为其选出的目标节点上,不过&#…

吴恩达深度学习笔记:机器学习策略(2)(ML Strategy (2)) 2.7-2.8

目录 第三门课 结构化机器学习项目(Structuring Machine Learning Projects)第二周:机器学习策略(2)(ML Strategy (2))2.7 迁移学习(Transfer learning) 第三门课 结构化机器学习项目&#xff0…

学习笔记——动态路由——IS-IS中间系统到中间系统(区域划分)

三、IS-IS区域划分 根据IS-IS路由器邻居关系,可以将IS-IS划分为两个区域——骨干区域和非骨干区域。(注意,这里的区域不是上文中提到的Area ID)由L2的IS-IS邻居构成的区域为骨干区域,由L1的IS-IS邻居构成的区域为非骨…

智能运维场景探索 | 运营分析

【本场景来源于 擎创科技《一体化数智运维AIOps解决方案》白皮书,经过重新编写】 该场景主要围绕生产运行、运营决策两个维度进行展开,通过对配置、性能、业务等运行数据的加工计算,形成可量化运营效果、可衡量发展方向的运营数据。整体以低…

基于Qt实现的PDF阅读、编辑工具

记录一下实现pdf工具功能 语言:c、qt IDE:vs2017 环境:win10 一、功能演示: 二、功能介绍: 1.基于saribbon主体界面框架,该框架主要是为了实现类似word导航项 2.加载PDF放大缩小以及预览功能 3.pdf页面跳转…

Python基础小知识问答系列-高效遍历多个不同类型元素的迭代器

1. 问题: 当需要对多个迭代器进行相同遍历操作时,如何避免因为迭代器之间的类型或者迭代器元素 数量过大引发的问题? 2. 解决方法: 使用itertools模块中的chain函数。 示例: from itertools import chainlist_a [2,…

matlab 抛物线图像绘制

抛物线图像绘制 x^2y4绘制结果 x^2y4 clc,clear,close all; length10; % 创建一个范围内的 x 和 y 值 x linspace(-length, length, 1000); y linspace(-length, length, 1000);% 创建一个网格来表示 x 和 y 值的组合 [X, Y] meshgrid(x, y);% 计算方程的左边和右边的值 LH…

QWidget成员函数功能和使用详细说明(四)(文字+用例+代码+效果图)

文章目录 1.测试工程配置2.成员函数2.1 void setParent(QWidget *parent)2.2 void setMouseTracking(bool enable)2.3 bool hasMouseTracking() const2.4 void setPalette(const QPalette &)2.5 const QPalette &palette() const2.6 int QWidget::grabShortcut(const Q…

实战干货,企业在数字化转型中如何通过最佳实践落地BI报表?

引言:上一篇文章我们提到:通过9大步骤,帮助企业在数字化转型中搭建数据分析的报表体系!在实际中的落地过程,通过实施服务的哪些最佳实践可以确保落地效果,达到项目预期目标,给客户带来实质价值&…

香蕉云编+uniapp打包ios的开发包和生产包

登录香蕉云编,找到 云编-ios证书生成,新建CSR文件,并下载csr文件。 登录苹果开发者中心,进入证书页面。 1.创建一个证书,选择ios Distribution类型即可,这是个通用的证书,既能用来打正式包又能…

“郭有才”商标主要类别都已被注册!

前阵山东网红“郭有才”火遍大江北,当然少不了许多想去申请注册“郭有才”商标名称的,普推商标知产老杨检索,发现“郭有才”商标申请了43个类别,基本上类别都被申请注册,已注册的商标大多是在“郭有才”火之前申请注册…

MyBatis入门程序详解

目录 一、MyBatis概述 二、编写MyBatis入门程序 三、配置SQL提示 四、传统jdbc的劣势 一、MyBatis概述 MyBatis是一个基于Java的持久层框架,它内部封装了JDBC操作,使得开发人员可以更专注于SQL语句本身而非繁琐的JDBC操作细节。在MyBatis中&#xff0…

最新全平台无人直播硬改XCMS系统,支持任何平台

软件功能: 改虚拟摄像头为真实摄像头,改真实麦克风,图层去重、镜头晃动、增加噪点去重、随机播放辅音,两条音轨帮助音频去重、随机音效、随机播放速度,直播源实时转播等等.防违规,防非实时 设备需求: 电脑&#xf…