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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 学习大数据需要什么基础?大数据要学哪些内容?

    学习大数据需要什么基础?大数据要学哪些内容?大数据只需要学习Java的标准版JavaSE就可以了,像Servlet、JSP、Tomcat、Struct、Spring、Hibernate,Mybaits都是JavaEE方向的技术在大数据技术里用到的并不多,只需要了解就可以了,当然Java怎么连接数据库还是要知道的,像JDBC一定要掌握一下,有同学说Hibernate或Mybaits也能连接数据库啊,为什么不学习一下,我这里不是…

  • Anaconda python3.6版本安装[通俗易懂]

    Anaconda python3.6版本安装[通俗易懂]官方地址在下面,3.6的对应的是Anaconda3-5.2,5.3以后的都是python3.7的不要看错了往下滑动就是了官方地址:https://repo.anaconda.com/archive/清华大学镜像:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/…

  • Oracle 绑定变量_oracle变量不在选择列表中

    Oracle 绑定变量_oracle变量不在选择列表中begintest.test(a=>1,b=>:603);end;执行的时候报错:Ora-01008错误:Oracle?并非所有变量都已绑定原因是??b=>:603之前多了一个冒号导致他判断错误,解决方法是检查和删除不需要的冒号。…

  • 关于iptabels的-A与-I参数

    关于iptabels的-A与-I参数

  • 电磁场与电磁波实验 01 – | 位移电流测量及电磁场与电磁波的存在实验[通俗易懂]

    电磁场与电磁波实验 01 – | 位移电流测量及电磁场与电磁波的存在实验[通俗易懂]一、实验目的 1、认识时变电磁场,理解电磁感应的原理和作用 2、理解电磁波辐射原理 3、了解位移电流的概念 二、预习要求 1、什么是法拉第电磁感应定律? 2、半波振子天线的原理。 三、实验仪器 HD-CB-V电磁场电磁波数字智能实训平台:1套 电磁波传输电缆:1套; 平板极化天线:1副; 半波振子天线:1副 (…

    2022年10月29日
  • Android自动填充短信验证码[通俗易懂]

    Android自动填充短信验证码[通俗易懂]前言短信验证码获取并自动填写现在已经成为一个人性化App的标配了,这篇文章将实现一个短信验证码获取并自动填写的demo。其实就是读取指定号码的短信并提取出验证码,然后赋值给EditText显示。demo效果图:读取短信Android系统在接受到一条短信的时候会发出一条Action为android.provider.Telephony.SMS_RECEIVED的有序广播,因此我们读取短信的…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号