多线程程序复习003

 

多线程程序复习三 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)只能由拥有其的线程调用释放


这里补充一下EventSetEventResetEvent

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, // SDNULL:使用默认安全性)

  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发生变化前,多个进程拿到进入权限

死锁条件:①互斥条件 ②不剥夺条件 ③部分分配 ④环路条件

解决死锁:①一次性分配 ②资源顺序分配 ③先释放,后申请

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值