多线程同步的意义:细分任务,充分利用CPU,提升效率。
概念:
1. 间接制约关系(互斥):两个线程共同享有某个资源,需要对该资源进行互斥访问,则它们的关系是“互斥”。互斥则产生先后,所以“互斥”是一种特殊的同步。
2. 直接制约关系(同步):一个线程需调用另一个线程运行的结果才能继续进行,则它们的关系是“同步”。“同步”包含互斥。
实现方法:
1. event
(1)CreateEvent( );
(2)OpenEvent( );
(3)SetEvent( );
(4)ResetEvent( );
2. mutex
(1)CreateMutex( );
(2)OpenMutex( );
(3)ReleaseMutex( );
3. CriticalSection
(1)InitializeCriticalSection( );
(2)DeleteCriticalSection( );
(3)EnterCriticalSection( );
(4)LeaveCriticalSection( );
4. Semaphore
(1)CreateSemaphore( );
(2)OpenSemaphore( );
(3)ReleaseSemaphore( );
5. 公用函数
(1)WaitForSingleObject( );
(2)CloseHandle( );
区别:
1. CriticalSection与Mutex都有“线程所有权”概念,当程序通过WaitForSingleObject(EnterCriticalSection)语句后,当前线程即拥有该互斥量(关键段),直至其它线程占有它。只可处理线程的间接制约关系(互斥),不可处理线程的直接制约关系(同步)。
2. Event与Semaphore可以处理线程的直接制约关系(同步)。
3. Mutex,Event和Semaphore都可以用于跨进程的线程互斥同步,但只有“Mutex”可以解决“遗弃”问题,所以跨进程用Mutex进行线程同步安全。
遗弃问题:当线程占有Mutex,Event或Semaphore时突然终止,并未释放时(ReleaseMutex,ResetEvent,ReleaseSemaphore),其它等待中的线程(WaitForSingleObject)可能会因再也得不到资源而一直等待下去。
线程拥有权:thread( )内部执行的是一个死循环,第一次通过WaitForSingleObject后,thread( )拥有了mutex,其它等待该mutex的线程需要等待thread( )释放(ReleaseMutex(mutex)),否则一直等待。但thread( )第二次到达WaitForSingleObject时,仍能通过,无需等待。
thread( )
{
while(1)
{
WaitForSingleObject(mutex, INIFINITE);
.
.
.
//结束
}
}
更加系统具体的内容请参考
【Windows多线程同步】
本文对应
【Demo】