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.mfbz.cn/a/777145.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于java+springboot+vue实现的流浪动物管理系统(文末源码+Lw)277

摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对流浪动物信息管理的提升&…

玩转Easysearch语法

Elasticsearch 是一个基于Apache Lucene的开源分布式搜索和分析引擎,广泛应用于全文搜索、结构化搜索、分析等多种场景。 Easysearch 作为Elasticsearch 的国产化替代方案,不仅保持了与原生Elasticsearch 的高度兼容性,还在功能、性能、稳定性…

Spring框架Mvc(2)

1.传递数组 代码示例 结果 2.集合参数存储并进行存储类似集合类 代码示例 postman进行测试 ,测试结果 3.用Json来对其进行数据的传递 (1)Json是一个经常使用的用来表示对象的字符串 (2)Json字符串在字符串和对象…

Mysql数据库索引、事务相关知识

索引 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引, 并指定索引的类型,各类索引有各自的数据结构实现 查看索引 show index from 表名;创建索引对于非主键、非唯一约束、非外键的字段&#…

JAVA ArrayList应用案例

一案例要求&#xff1a; 二代码&#xff1a; package 重修;import java.util.ArrayList; import java.util.Random; import java.util.Scanner;public class first {public static void main(String[] args) {ArrayList<String>arrayListnew ArrayList<>();array…

ctfshow-web入门-文件包含(web87)巧用 php://filter 流绕过死亡函数的三种方法

目录 方法1&#xff1a;php://filter 流的 base64-decode 方法 方法2&#xff1a;通过 rot13 编码实现绕过 方法3&#xff1a;通过 strip_tags 函数去除 XML 标签 除了替换&#xff0c;新增 file_put_contents 函数&#xff0c;将会往 $file 里写入 <?php die(大佬别秀了…

微软与OpenAI/谷歌与三星的AI交易受欧盟重点关注

近日&#xff0c;欧盟委员会主管竞争事务的副主席玛格丽特维斯塔格(Margrethe Vestager)在一次演讲中透露&#xff0c;欧盟反垄断监管机构将就微软与OpenAI的合作&#xff0c;以及谷歌与三星达成的AI协议寻求更多第三方意见。这意味着微软与 OpenAI、谷歌与三星的 AI 交易及合作…

MySQL中的DDL语句

第一题 输入密码登录mysql&#xff0c;创建数据库zoo&#xff0c;转换到zoo数据库&#xff0c; mysql> create database zoo character set gbk; mysql> use zoo查看创建数据库zoo信息 mysql> show create database zoo;删除数据库zoo mysql> drop database zo…

独立开发者系列(20)——扫码登录

&#xff08;1&#xff09;网页端的安全登录设计 很多大型网站都有登录限制。这里以一个案例作为例子完整解析。理解安全的登录设计方式&#xff0c;无论对于以后做自动化&#xff0c;自动登录网站&#xff0c;获取数据&#xff0c;还是自己开发月租类型的系统非常有用。当前一…

2024菜鸟春招笔试

第一题 解题思路&#xff1a; 签到题&#xff0c;把帖子按好评度降序排列&#xff0c;再将人按升序排列。 第二题 解题思路 从左到右遍历&#xff0c;如果当前元素没有错排&#xff0c;将其与后一个交换&#xff0c;这样两个元素一定都错排。 第三题 、 解题思路 这题当时暴力…

【总线】AXI4第八课时:介绍AXI的 “原子访问“ :独占访问(Exclusive Access)和锁定访问(Locked Access)

大家好,欢迎来到今天的总线学习时间!如果你对电子设计、特别是FPGA和SoC设计感兴趣&#xff0c;那你绝对不能错过我们今天的主角——AXI4总线。作为ARM公司AMBA总线家族中的佼佼者&#xff0c;AXI4以其高性能和高度可扩展性&#xff0c;成为了现代电子系统中不可或缺的通信桥梁…

comsol随机材料参数赋值

comsol随机材料参数赋值 在comsol中定义外部matlab函数 在comsol中定义外部matlab函数 首选项&#xff0c;安全性&#xff0c;允许 材料中&#xff0c;将杨氏模量更改为变量函数 计算 应力有波动&#xff0c;可见赋值成功 也可以看到赋值的材料参数&#xff1a;

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…

【启明智显分享】乐鑫HMI方案2.8寸触摸串口屏应用于太阳能控制器

前言 太阳能作为一种无尽的、可再生的能源&#xff0c;在现代社会的能源结构中占据着日益重要的地位。而在太阳能应用系统中&#xff0c;有一种设备是不可或缺的&#xff0c;那就是太阳能控制器。太阳能控制器在太阳能系统中起着至关重要的作用&#xff0c;它保证系统的安全和…

redis学习(005 java客户端 RedisTemplate学习)

黑马程序员Redis入门到实战教程&#xff0c;深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 总时长 42:48:00 共175P 此文章包含第16p-第p23的内容 文章目录 java客户端jedisSpringDataRedis项目实现hash哈希操作 java客户端 jedis 测试 ps:如果连接不上&…

C-study(五).2

逻辑运算符 连接两个完整的关系表达式。 && 逻辑与&#xff0c;ab都为真时&#xff0c;a&&b的值真&#xff0c;其余时候假。 || 逻辑或&#xff0c;ab都为假时&#xff0c;a||b的值假&#xff0c;其余时候真。 ! 逻辑非、只需要一个运算对象&#xff0c;a真&a…

维护和管理LDAP之OpenDJ

目录 基本介绍 服务专有名词 安装 命令行工具 密码管理 重置管理员密码 管理服务器进程 管理索引 如何搜索 管理索引 管理目录数据 测试数据 导出数据 导入数据 LDIF文件数据查看和比较 数据存储-Backends 配置连接 开启 HTTP/HTTPS连接 使用 REST访问 -open…

三、虚拟机连接外网

来源网站&#xff1a;山海同行 来源地址&#xff1a;https://shanhaigo.cn 本篇资源&#xff1a;以整理分类并关联本篇地址 本篇地址&#xff1a;https://shanhaigo.cn/courseDetail/1805875642621952000 一、配置虚拟机 1. 选择NAT模式 编辑虚拟网络设置&#xff0c;选择NAT…

1分钟完美音质克隆:配音软件全面超越,

随着人工智能技术的不断进步&#xff0c;配音软件在提供高质量声音输出方面取得了显著成就。本文所讨论的软件产品&#xff0c;凭借其卓越的性能&#xff0c;已成为自媒体创作者在声音制作方面的首选工具。 2. 软件产品概述 该软件利用先进的算法和机器学习模型&#xff0c;为…

docker也能提权??内网学习第6天 rsync未授权访问覆盖 sudo(cve-2021-3156)漏洞提权 polkit漏洞利用

现在我们来说说liunx提权的操作&#xff1a;前面我们说了环境变量&#xff0c;定时任务来进行提权的操作 rsync未授权访问覆盖 我们先来说说什么是rsync rsync是数据备份工具&#xff0c;默认是开启的873端口 我们在进行远程连接的时候&#xff0c;如果它没有让我们输入账号…