2014-04-15 105 views
4

我有一種情況,我想要做類似如下所示的事情,但似乎沒有查詢互斥體而不更改其狀態的方法。我不希望someFunctionCalledRepeatedlyFromAnotherThread()掛起來等待互斥鎖被釋放。它必須在執行一些替代操作後立即返回。我猜這個遺漏是爲了安全起見的,因爲在查詢它和返回函數之間的鎖定時間內,鎖可能會釋放。在我的情況下,如果鎖定被釋放,doSomeAlternativeAction()正在發生,則不會發生壞事。事實上,我在這種情況下可能意味着我做錯了什麼,所以我應該如何改變我的設計?查詢std :: mutex鎖定狀態

class MyClass 
{ 
    std::mutex initMutex; 
public: 
    void someInitializationFunction() 
    { 
     std::lock_guard<std::mutex> lock(initMutex); 
     // Do some work 
    } 

    void someFunctionCalledRepeatedlyFromAnotherThread() 
    { 
     if (initMutex.isLocked()) 
     { 
      doSomeAlternativeAction(); 
      return; 
     } 
     // otherwise . . . 
     std::lock_guard<std::mutex> lock(initMutex); 
     // carry on with work as usual 
    } 
} 
+2

您可能想要使用[std :: mutex :: try_lock](http://www.cplusplus.com/reference/mutex/mutex/try_lock/)。 – Jarod42

+0

。 。 。但是這改變了互斥體的狀態。 – learnvst

+0

@learnvst但是隻有當互斥鎖沒有被鎖定,並且這種情況下,你的代碼也會改變它的狀態。 – Angew

回答

9

其狀態詢問互斥是無用的:可以現在解鎖,但你的時間避開鎖定它,它可能會被鎖定。所以它沒有這樣的方法。

它,然而,有一種方法,其try_lock()鎖定它,如果它沒有被鎖定,並返回true如果它獲得鎖和false否則。並且std::unique_lock(更高級版本的std::lock_guard)可以選擇調用它。

所以,你可以這樣做:

void someFunctionCalledRepeatedlyFromAnotherThread() 
{ 
    std::unique_lock<std::mutex> lock(initMutex, std::try_to_lock); 
    if(!lock.owns_lock()) 
    { 
     doSomeAlternativeAction(); 
     return; 
    } 
    // otherwise ... go ahead, you have the lock 
} 
0

聽起來像是你想使用std :: unique_lock代替的std :: lock_guard。 try_lock方法的作用與Windows上的TryEnterCriticalSection類似,函數會自動獲取鎖,如果可以則返回'true',或者如果鎖無法獲取(並且不會阻塞),則返回'false'。請參閱http://msdn.microsoft.com/en-us/library/hh921439.aspxhttp://en.cppreference.com/w/cpp/thread/unique_lock/try_lock。請注意,unique_lock也有其他成員可用於嘗試鎖定,例如try_lock_for和try_lock_until。