理解Mutex的lock和tryLock功能差异
最编程
2024-07-28 19:14:30
...
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。
推荐阅读
-
理解Java ReentrantLock中的tryLock与lock差异:聚焦公平锁与非公平锁的实战解析
-
快速了解面试技巧43:理解lock、tryLock和lockInterruptibly之间的差异
-
Redisson中tryLock方法与普通lock功能的差异解析
-
深入理解Java中Lock和tryLock方法的工作原理与应用
-
详解Redis与Redisson的lock和tryLock功能实现机制
-
理解ReentrantLock中的lock与tryLock操作差异
-
理解并比较ReentrantLock的 lockInterruptibly、lock 和 tryLock 功能
-
理解Mutex的lock和tryLock功能差异
-
Redisson中TryLock与Lock功能的比较与差异探索
-
Redisson Lock 和 TryLock 的主要差异点