事件和线程同步

admin 2018年5月10日19:31:59评论397 views字数 984阅读3分16秒阅读模式
摘要

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


事件和线程同步

函数

//创建一个时间对象  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 继续执行 同样不会修改。此时就像通知一样,其他的线程都可以往下继续执行了。

线程同步

  • 线程的互斥

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

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

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

同步 = 互斥 + 有序

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2018年5月10日19:31:59
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   事件和线程同步http://cn-sec.com/archives/51290.html

发表评论

匿名网友 填写信息