线程之间的通信/同步方法? 到目前为止,编辑已经介绍了进程之间的通信方式,但一些合作伙伴对线程之间的通信和同步方式感兴趣。 没关系。 以下编辑将继续介绍线程之间的通信和同步方法。
介绍线程间通信和同步方法:
一、线程间的通信方式
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类实现线程间通信
事件对象有两种状态:信号和信号,线程可以监视处于信号状态的事件,并根据需要对事件执行操作。
1 )创建CEvent类对象) CEvent threadStart; 默认情况下不通信;
2 ) threadStart.SetEvent (; 设为通信状态;
3 )调用WaitForSingleObject ) )监视CEvent对象。
二.线程间同步方式
因为每个线程都可以访问进程中的公共变量、资源,所以使用多线程时需要注意的问题是防止多个线程同时访问同一数据,以免破坏数据的完整性。
数据之间的相互约束如下
1 .直接约束关系,也就是说,由于一个线程的处理结果是对另一个线程的输入,因此线程之间被直接约束,该关系可以被称为同步关系。
2 .间接约束关系,即两个线程需要访问同一资源,而该资源在同一时间只能由一个线程访问,这种关系被称为线程间资源的排他访问,在某种意义上,排他关系更少
线程之间的同步方法有以下四种。
1、临界区
关键节对应于CcriticalSection对象,并在线程需要访问受保护的数据时调用EnterCriticalSection函数。 保护数据操作完成后,调用LeaveCriticalSection函数以释放关键对象的所有权,并允许另一个线程夺取关键对象访问受保护的数据。
PS :关键段对象记录拥有该对象的线程句柄。 也就是说,它拥有“线程所有权”的概念。 也就是说,进入代码段的线程可以在leave之前重复进入关键代码区域。 因此,关键段可以用于线程之间的互斥,但不能用于同步。 同步必须在一个线程上开始,在另一个线程上leave。
2、互斥量
独占锁与关键节非常相似,但在使用时相对复杂。 独占量是内核对象。 不仅可以在同一APP应用程序的线程之间同步,还可以在不同进程之间同步,从而安全地共享资源。
PS :
1 )因为独占量也有线程所有权的概念,所以只能在线程之间进行资源排他访问,通过线程同步
2 )互斥量是一个内核对象,具有可以进行进程间通信,同时在进程间通信时完善解决“遗弃”问题的优秀特性。
3、信号量
信号的使用方法与互斥的使用方法非常类似,不同的是,同一时间多个线程可以访问同一资源、PV操作。
PS :事件完全解决了线程之间的同步问题,信号也是内核对象,可以用于进程之间的通信。
4、案件
事件包括手动集事件和自动集事件。 事件事件内部包含所有内核对象的使用计数。 布尔值指示是手动设置事件还是自动设置事件,布尔值指示是否触发了事件。 SetEvent ()、ResetEvent ) )中无触发器。
PS :事件是内核对象,可以解决线程间同步问题,因此也可以解决互斥问题。
虽然我们已经讨论了线程之间的通信和同步方法,但是有关线程同步的更多文章,请参见《线程同步的方法有哪些?Linux下实现线程同步的三种方法》