查询std :: mutex的锁定状态

时间:2014-04-15 09:48:41

标签: c++ multithreading c++11 mutex

我有一种情况,我想做下面所示的事情,但似乎没有办法在不改变状态的情况下查询互斥锁。我不希望someFunctionCalledRepeatedlyFromAnotherThread()等待互斥锁释放,如果它被锁定。它必须在执行一些替代操作后立即返回。我猜这个遗漏是为了安全,因为锁可能在查询它和返回函数之间释放。在我的情况下,如果在doSomeAlternativeAction()发生时释放锁,则不会发生错误。我遇到这种情况可能意味着我做错了什么,所以我应该如何改变我的设计呢?

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 个答案:

答案 0 :(得分:9)

要求互斥锁处于其状态是没用的:它现在可以解锁,但是当你到处锁定它时,它可能会被锁定。所以它没有这样的方法。

然而,它确实有一个方法try_lock(),如果它没有被锁定就锁定它,如果它获得锁定则返回true,否则返回falsestd::unique_lockstd::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
}

答案 1 :(得分: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。