多线程程序复习三 2011.05.03
互斥量(Mutex):
互斥量是一种内核对象,这东西用途如其名,在一个时间内只能被单一线程拥有权限。
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes, // SD(NULL:使用默认安全性)
BOOL bInitialOwner, // initial owner(TRUE:当前进程获取该对象权限,nonsignaled)
LPCTSTR lpName // object name(为互斥对象命名,供OpenMutex使用)
); //创建一个互斥对象
由于其是内核对象,所以互斥对象命名在内核中是唯一的。
OpenMutex 通过互斥对象名称获取互斥对象的句柄
ReleaseMutex 释放当前互斥对象的拥有权(设为signaled),只能由拥有其的线程调用释放
这里补充一下Event的SetEvent和ResetEvent
Event是可以在别的线程对当前使用线程进行signaled 和 nonsinaled操作的
利用互斥对象实现线程同步:
①创建一个互斥对象,参数 bInitialOwner 为 FALSE,表示创建线程不拥有权限
②线程对共享数据操作前,利用WaitSingleObject in INFINIT 测试互斥对象,如果其没有线程拥有权限,即其为signaled状态,同时函数返回,其对象状态变为nonsignaled,其他线程的WaitSingleObject会一直等待
WaitSingleObject 返回值:
WAIT_OBJECT_0 对象状态为signaled
WAIT_ABANDONED 等待的对象是一个Mutex对象,其属线程在结束时候没有对其释放。这时,该对象的所有权将授予当前调用线程,并将其设置为nonsignaled
③线程对共享数据操作后,利用 ReleaseMutex 设置对象状态为 signaled 供别的线程用
④最后该互斥对象不使用了,用CloseHandle关闭该对象
信号量(Semaphore['semə,fo]):
信号量对象是一个允许指定数量的线程获取的内核对象,就是说把资源进行定量的分配。
当信号量的初始计数为1的时候,它就是一个互斥量。
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // SD(NULL:使用默认安全性)
LONG lInitialCount, // initial count(初始计数)
LONG lMaximumCount, // maximum count(最大计数)
LPCTSTR lpName // object name(名称,方便OpenSemaphore打开对象)
);//创建一个信号量对象
OpenSemaphore根据object name打开一个信号量对象,返回对象句柄
BOOL ReleaseSemaphore(
HANDLE hSemaphore, // handle to semaphore
LONG lReleaseCount, // count increment amount
LPLONG lpPreviousCount // previous count (返回之前的信号量计数)
);//释放当前信号量的一个计数,信号量计数+lReleaseCount,当lReleaseCount为负数时,信号量计数会减少,达到控制目的(注意是LONG不是ULONG)
利用信号量对象实现线程同步:
①创建一个互斥对象,设置初始计数 和 最大计数
②线程对共享数据操作前,利用WaitSingleObject in INFINIT 测试信号量对象,如果信号量计数>0,即其为signaled状态,同时函数返回,其信号量计数-1,若信号量计数<=0,即其为 nonsignaled状态,线程的WaitSingleObject会一直等待
WaitSingleObject 返回值:
WAIT_OBJECT_0 对象状态为signaled
对于Semaphore signaled:信号量计数>0 nonsignaled:信号量计数<=0
③最后该互斥对象不使用了,用CloseHandle关闭该对象
注意:如果在信号量使用过程中想调整信号量计数,可用ReleaseSemaphore。
技巧:
在MSDN中查找Synchronization Functions就可以得到各种同步函数了。
复习操作系统理论:
互斥准则:①公平竞争 ②有空让进 ③唯一进入 ④有限等待
互斥加锁法:缺点:不能保证准则③,在key发生变化前,多个进程拿到进入权限
死锁条件:①互斥条件 ②不剥夺条件 ③部分分配 ④环路条件
解决死锁:①一次性分配 ②资源顺序分配 ③先释放,后申请