windows下线程间的通信、同步方式

1、线程间的通信方式

  • 使用全局变量
    主要由于多个线程可能更改全局变量,因此全局变量最好声明为violate
  • 使用消息实现通信
    在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程默认自带消息队列和消息循环,工作线程需要手动实现消息循环),因此可以采用消息进行线程间通信sendMessage,postMessage。
     
    1. 1)定义消息#define WM_THREAD_SENDMSG=WM_USER+20;

    2. 2)添加消息函数声明afx_msg int OnTSendmsg();

    3. 3)添加消息映射ON_MESSAGE(WM_THREAD_SENDMSG,OnTSM)

    4. 4)添加OnTSM()的实现函数;

    5. 5)在线程函数中添加PostMessage消息Post函数

  • 使用事件CEvent类实现线程间通信
    Event对象有两种状态:有信号和无信号,线程可以监视处于有信号状态的事件,以便在适当的时候执行对事件的操作。
     
    1. 1)创建一个CEvent类的对象:CEvent threadStart;它默认处在未通信状态;

    2. 2)threadStart.SetEvent();使其处于通信状态;

    3. 3)调用WaitForSingleObject()来监视CEvent对象

2、线程间的同步方式

各个线程可以访问进程中的公共变量,资源,所以使用多线程的过程中需要注意的问题是如何防止两个或两个以上的线程同时访问同一个数据,以免破坏数据的完整性。数据之间的相互制约包括
1、直接制约关系,即一个线程的处理结果,为另一个线程的输入,因此线程之间直接制约着,这种关系可以称之为同步关系
2、间接制约关系,即两个线程需要访问同一资源,该资源在同一时刻只能被一个线程访问,这种关系称之为线程间对资源的互斥访问,某种意义上说互斥是一种制约关系更小的同步

线程间的同步方式有四种

猜你喜欢

转载自blog.csdn.net/qq_37050329/article/details/82797555