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版到盘古大模型的震撼发布,华为正以前所未有的速度重塑智能生态。以下是本次大会的亮点,让我们…

中英双语介绍四大会计师事务所(Big Four accounting firms)

中文版 “四大会计师事务所”(Big Four accounting firms)是全球最具影响力和规模最大的四家专业服务公司,它们在审计、税务、咨询和财务咨询等领域占据着主导地位。这四家公司分别是普华永道(PwC)、德勤(…

MUNIK解读ISO26262--系统架构

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

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

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

【Spring Cloud】Spring Cloud Gateway 中配置跨域

Spring Cloud Gateway 中配置跨域 一、代码配置方式配置跨域二、配置文件方式配置跨域 开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。API网关作为所有请求的入口,请求量大,我们可以通过对并发访问的请求进行限速来保护系统的可…

快速上手文心一言指令:从零开始的详细指南

快速上手文心一言指令:从零开始的详细指南 一、引言 随着人工智能技术的不断进步,自然语言处理(NLP)已成为现代计算机科学和人工智能领域中的一个重要研究方向。它不仅在学术界取得了显著成果,更在实际应用中展现出巨…

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解决方案》白皮书,经过重新编写】 该场景主要围绕生产运行、运营决策两个维度进行展开,通过对配置、性能、业务等运行数据的加工计算,形成可量化运营效果、可衡量发展方向的运营数据。整体以低…

如何在Spring Boot中使用gRPC

如何在Spring Boot中使用gRPC 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Spring Boot应用中集成和使用gRPC,这是一种高性能…

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

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

android调用openssl库

android 调用openssl库 一、openssl安装编译 下载openssl-1.1.1w.tar.gz和android-ndk-r21e-linux-x86_64.zip解压android-ndk-r21e-linux-x86_64.zip到/opt/pj_ssl目录下,然后配置环境 vim ~/.bashrc增加如下内容 export NDK_HOME/opt/pj_ssl/android-ndk-r21e…

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

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

MySQL SQL查询执行顺序解析

目录 MySQL SQL查询执行顺序解析一、MySQL SQL查询的基本概念和特点SQL的特点 二、MySQL SQL查询的执行顺序查询语句的顺序参数的执行顺序实际案例 三、查询执行过程中的关键步骤和组件索引查询缓存查询执行 四、如何优化MySQL SQL查询性能1. 使用合适的索引2. 优化查询语句3. …

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…