线程间通信及同步方法介绍
发布时间:2023-08-08 16:24:03
线程间如何通信/同步?此前小编给大家介绍了进程间通信的方法,于是一些伙伴又好奇线程间的通信及同步方法,没关系,下面小编就继续给大家科普下线程间通信及同步的方法。
线程间通信及同步方法介绍:
一、线程间的通信方式
1、使用全局变量
主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile。
2、使用消息实现通信
在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信sendMessage,postMessage。
1)定义消息#define WM_THREAD_SENDMSG=WM_USER+20;
2)添加消息函数声明afx_msg int OnTSendmsg();
3)添加消息映射ON_MESSAGE(WM_THREAD_SENDMSG,OnTSM);
4)添加OnTSM()的实现函数;
5)在线程函数中添加PostMessage消息Post函数。
3、使用事件CEvent类实现线程间通信
Event对象有两种状态:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。
1)创建一个CEvent类的对象:CEvent threadStart;它默认处在未通信状态;
2)threadStart.SetEvent();使其处于通信状态;
3)调用WaitForSingleObject()来监视CEvent对象。
二、线程间的同步方式
各个线程可以访问进程中的公共变量,资源,所以使用多线程的过程中需要注意的问题是如何防止两个或两个以上的线程同时访问同一个数据,以免破坏数据的完整性。
数据之间的相互制约包括:
1、直接制约关系,即一个线程的处理结果,为另一个线程的输入,因此线程之间直接制约着,这种关系可以称之为同步关系。
2、间接制约关系,即两个线程需要访问同一资源,该资源在同一时刻只能被一个线程访问,这种关系称之为线程间对资源的互斥访问,某种意义上说互斥是一种制约关系更小的同步。
线程间的同步方式有四种:
1、临界区
临界区对应着一个CcriticalSection对象,当线程需要访问保护数据时,调用EnterCriticalSection函数;当对保护数据的操作完成之后,调用LeaveCriticalSection函数释放对临界区对象的拥有权,以使另一个线程可以夺取临界区对象并访问受保护的数据。
PS:关键段对象会记录拥有该对象的线程句柄即其具有“线程所有权”概念,即进入代码段的线程在leave之前,可以重复进入关键代码区域。所以关键段可以用于线程间的互斥,但不可以用于同步(同步需要在一个线程进入,在另一个线程leave)。
2、互斥量
互斥与临界区很相似,但是使用时相对复杂一些(互斥量为内核对象),不仅可以在同一应用程序的线程间实现同步,还可以在不同的进程间实现同步,从而实现资源的安全共享。
PS:
1)互斥量由于也有线程所有权的概念,故也只能进行线程间的资源互斥访问,不能由于线程同步;
2)由于互斥量是内核对象,因此其可以进行进程间通信,同时还具有一个很好的特性,就是在进程间通信时完美的解决了“遗弃”问题。
3、信号量
信号量的用法和互斥的用法很相似,不同的是它可以同一时刻允许多个线程访问同一个资源,PV操作。
PS:事件可以完美解决线程间的同步问题,同时信号量也属于内核对象,可用于进程间的通信。
4、事件
事件分为手动置位事件和自动置位事件。事件Event内部它包含一个使用计数(所有内核对象都有),一个布尔值表示是手动置位事件还是自动置位事件,另一个布尔值用来表示事件有无触发。由SetEvent()来触发,由ResetEvent()来设成未触发。
PS:事件是内核对象,可以解决线程间同步问题,因此也能解决互斥问题。
关于线程间的通信及同步方法就给大家讲解到这里了,更多关于线程同步的文章,大家可以参考:《线程同步的方法有哪些?Linux下实现线程同步的三种方法》


猜你喜欢
- 许多用户都会觉得“系统帮助与支持”功能没用然后将其删除,需要使用的时候却不知怎么找回。那么这种被删除掉的功能是否可以寻回呢?下面小编就教大家
- Windows系统中都自带一个照片查看器功能,这个功能可以帮助我们轻松打开各种格式的图片,但一些使用Win11系统的小伙伴说自己使用照片查看
- win10怎么使用Windows Hello PIN登录系统?win10系统中想要设置Windows Hello PIN 登录系统,该怎么实
- Word里面调整行距是在普通不过的基础操作,很容易调整。那么有想过excel行距怎么设置吗?下面的演示,excel两个单元格的文字内容,行距
- 有时候我们会使用到u盘,比如u盘重装系统,但是经常会有用户反映u盘在电脑上读不出来怎么办呢?插上u盘后没有任何反映,
- 派出所的一个朋友在调查一起案件的时候,遇到了一个如题的问题,请我帮忙。由于要保密他不能提供原始数据,只是给我谈了一下要求。派出所的一个朋友在
- 很多朋友不知道如何更改win7系统中的宋体?其实方法很简单的,下面有个不错的方法大家可以尝试操作下1>首先安装需要替换的字体,推荐XP
- 自己有一个文件夹里面有很重要的资料,能不能将这个文件夹加密一下,如果我要使用再解密。今天给这位朋友出一个关于文件夹如何加密教程。
- 赛博朋克2077是一款当前市面上一款十分火热的角色扮演游戏,我们在玩游戏的时候经常会遇到各种各样的bug。前几日有的小伙伴向我提问:我在玩游
- 在日常生活当中,不管是因为考试还是因为投简历,不管是学生党还是上班族,都会有用到自己证件照的时候,大多情况下,准备好白蓝红三种底色就足以应对
- Win7电脑声音图标没有了怎么办?许多用户在使用电脑的时候都会针对声音进行调整,而最近有许多win7电脑的用户反映自己的电脑声音图标消失不见
- 在我们使用word的时候经常会需要插入一些网址或者其他的东西,所以我们往往会用到超链接这一功能,仍有许多朋友不知道word的超链接如何使用。
- 我们要解决一个问题,如果一个域控制器我们不需要了,那应该如何处理呢?如果我们让这台域控制器直接消失,那么其他的域控制器就无法得知这个消息,每
- 我们都知道在同一个工作表中,想得到多数值的合计结果一般都会采用SUM函数或者更高阶的SUMIF和SUMIFS,但如果数据在不同的工作表里,我
- 先说一下如果要使用自动生成目录功能,需要对文章中对应的标题设置成相应的标题格式。希望小编的这篇文章可以帮到大家!Word2010文档自动生成
- 在进行Word文档编辑时,有时会用到大于等于号,这个要怎么打出来呢?下面小编就为大家详细介绍一下,不会的朋友可以参考本文,来看看吧Word大
- 反正弦函数在Excel中是比较常用的功能之一,如果有不懂的朋友却需要用到这个功能的朋友不妨学习一番吧!接下来是小编为大家带来的excel反正
- 在win7电脑中用户要想开启telnet服务却出现的失败的情况,这要怎么办呢,首先大家打开电脑的操作面板,点击程序和功能选项,勾选Telne
- 对于U盘,很多用户购买时都只是关注U盘存储容量,但其实U盘芯片的质量也是不容忽视的,U盘芯片相当于U盘的心脏,所以用户如果想要购买U盘,那么
- 我们在对思维导图进行设置的时候都喜欢在思维导图的主题中插入一些图片,或是为了美观,或是为了更好的解释我们主题的内容,无论是那种目的,学会在主