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。
參考:WaitForSingleObject函數用法