事件和线程同步

函数

//创建一个时间对象
HANDLE CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes, // SD 安全属性
  BOOL bManualReset,                       // reset type 0自动复位(互斥)、1手动复位(通知模式)
  BOOL bInitialState,                      // initial state 初始创建时时间是否具备信号
  LPCTSTR lpName                           // object name 对象的名称
);
//将目标事件对象设置为有信号的(同时通知其他线程)
BOOL SetEvent(
    HANDLE hEvent   // handle to event //目标事件的句柄
);
//将目标事件对象设置为无信号的
BOOL ResetEvent(
    HANDLE hEvent   // handle to event 目标事件的句柄
);

通知模式

回顾互斥模式

在线程间共享资源的时候,它们间的状态是互相排斥的,当A拿到所有权使用共享资源的时候,B线程是被排斥的,只有当A交出所有权的时候B才能够使用

中有个属性 标识符 比如说标识符为1的时候代表无人使用(有信号的),这个时候A和B回去抢夺锁,使用WaitForSingleObject来检测标识符,先到先得,比如线程A先到获得了信号,A就会获取信号回去所有权,此时锁会自动设置为0 代表无信号,此时A获得了临界区,可以访问共享资源,此时即使发生线程切换,也可保证共享资源的完整。当A使用完毕后,使用ReleaseMutex归还所有权,那么此时互斥锁状态改为1 有信号 回归无人使用。其他线程继续抢夺

通知模式

通知模式,A 或者B线程的WaitForSingleObject检测信号,当使用SetEventAPI发出信号的时候,与互斥模式不同,通知模式检测到 标识为 1的的时候 WaitForSingleObject 会立即返回往下执行,但不会修改信号标识,发生线程切换后,其他线程也可以检测到1 继续执行 同样不会修改。此时就像通知一样,其他的线程都可以往下继续执行了。

线程同步

  • 线程的互斥

    当某个共享资源被多个线程共同访问的时候,在同一时间只能有一个线程在访问我们的资源
    
  • 线程的同步

    线程的同步建立在线程互斥的基础上
    多个线程访问同一个资源的时候在互斥的基础上还有<code>有序
    </code>
    

例如:AB同时访问一个资源的时候,要求AB轮流有序的访问,而不是处于一种先到先得的抢夺状态

同步 = 互斥 + 有序