前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mutex的lock(), tryLock()区别[通俗易懂]

Mutex的lock(), tryLock()区别[通俗易懂]

作者头像
全栈程序员站长
发布2022-11-03 17:22:50
6680
发布2022-11-03 17:22:50
举报

lock函数和tryLock函数都是用于锁定对象,但他们之间有一定的区别: lock函数是阻塞的,因为它调用WaitForSingleObject函数时传递的第二个参数是INFINITE,表示无限等待下去,所以是阻塞的。 tryLock函数时非阻塞的,调用后立即返回。因为它调用WaitForSingleObject函数时传递的第二个参数是0,表示不等待,立即返回。 调用lock或者tryLock后,都需要调用unlock来解锁。

代码语言:javascript
复制
status_t Mutex::lock()  
{  
    DWORD dwWaitResult;  
    dwWaitResult = WaitForSingleObject((HANDLE) mState, INFINITE);  
    return dwWaitResult != WAIT_OBJECT_0 ? -1 : NO_ERROR;  
}  

void Mutex::unlock()  
{  
    if (!ReleaseMutex((HANDLE) mState))  
        LOG(LOG_WARN, "thread", "WARNING: bad result from unlocking mutex\n");  
}  

status_t Mutex::tryLock()  
{  
    DWORD dwWaitResult;  

    dwWaitResult = WaitForSingleObject((HANDLE) mState, 0);  
    if (dwWaitResult != WAIT_OBJECT_0 && dwWaitResult != WAIT_TIMEOUT)  
        LOG(LOG_WARN, "thread", "WARNING: bad result from try-locking mutex\n");  
    return (dwWaitResult == WAIT_OBJECT_0) ? 0 : -1;  
}  

WaitForSingleObject函数的用法如下:

DWORD WaitForSingleObject ( HANDLE hObject, //指明一个内核对象的句柄 DWORD dwMilliseconds //等待时间 ); 该函数需要传递一个内核对象句柄,该句柄标识一个内核对象, 如果该内核对象处于未通知状态,则该函数导致线程进入阻塞状态; 如果该内核对象处于已通知状态,则该函数立即返回WAIT_OBJECT_0。

第二个参数指明了需要等待的时间(毫秒),可以传递INFINITE指明要无限期等待下去, 如果第二个参数为0,那么函数就测试同步对象的状态并立即返回。 如果等待超时,该函数返回WAIT_TIMEOUT。 如果该函数失败,返回WAIT_FAILED。

原地址:http://blog.csdn.net/weiwangchao_/article/details/7938892

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/181513.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年10月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档