事件和线程同步
函数
//创建一个时间对象
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
检测信号,当使用SetEvent
API发出信号的时候,与互斥模式不同,通知模式检测到 标识为 1
的的时候 WaitForSingleObject
会立即返回往下执行,但不会修改信号标识,发生线程切换后,其他线程也可以检测到1 继续执行 同样不会修改。此时就像通知一样,其他的线程都可以往下继续执行了。
线程同步
-
线程的互斥
当某个共享资源被多个线程共同访问的时候,在同一时间只能有一个线程在访问我们的资源
-
线程的同步
线程的同步建立在线程互斥的基础上 多个线程访问同一个资源的时候在互斥的基础上还有<code>有序 </code>
例如:AB同时访问一个资源的时候,要求AB轮流有序的访问,而不是处于一种先到先得的抢夺状态
同步 = 互斥 + 有序