Mutex的lock(), tryLock()区别

lock函数和tryLock函数都是用于锁定对象,但他们之间有一定的区别:

lock函数是阻塞的,因为它调用WaitForSingleObject函数时传递的第二个参数是INFINITE,表示无限等待下去,所以是阻塞的。

tryLock函数时非阻塞的,调用后立即返回。因为它调用WaitForSingleObject函数时传递的第二个参数是0,表示不等待,立即返回。

调用lock或者tryLock后,都需要调用unlock来解锁。
  1. status_t Mutex::lock()  
  2. {  
  3.     DWORD dwWaitResult;  
  4.     dwWaitResult = WaitForSingleObject((HANDLE) mState, INFINITE);  
  5.     return dwWaitResult != WAIT_OBJECT_0 ? -1 : NO_ERROR;  
  6. }  
  7.   
  8. void Mutex::unlock()  
  9. {  
  10.     if (!ReleaseMutex((HANDLE) mState))  
  11.         LOG(LOG_WARN, "thread""WARNING: bad result from unlocking mutex\n");  
  12. }  
  13.   
  14. status_t Mutex::tryLock()  
  15. {  
  16.     DWORD dwWaitResult;  
  17.   
  18.     dwWaitResult = WaitForSingleObject((HANDLE) mState, 0);  
  19.     if (dwWaitResult != WAIT_OBJECT_0 && dwWaitResult != WAIT_TIMEOUT)  
  20.         LOG(LOG_WARN, "thread""WARNING: bad result from try-locking mutex\n");  
  21.     return (dwWaitResult == WAIT_OBJECT_0) ? 0 : -1;  
  22. }  

WaitForSingleObject函数的用法如下:

DWORD WaitForSingleObject(
HANDLE hObject, //指明一个内核对象的句柄
DWORD dwMilliseconds); //等待时间
  该函数需要传递一个内核对象句柄,该句柄标识一个内核对象,

如果该内核对象处于未通知状态,则该函数导致线程进入阻塞状态;

如果该内核对象处于已通知状态,则该函数立即返回WAIT_OBJECT_0。


第二个参数指明了需要等待的时间(毫秒),可以传递INFINITE指明要无限期等待下去,

如果第二个参数为0,那么函数就测试同步对象的状态并立即返回。

如果等待超时,该函数返回WAIT_TIMEOUT。

如果该函数失败,返回WAIT_FAILED。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值