2014-04-15 65 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。