繁体   English   中英

查询std :: mutex的锁定状态

[英]Query std::mutex for lock state

我有一种情况,我想做一些如下所示的事情,但似乎没有办法在不改变状态的情况下查询互斥锁。 我不希望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
    }
}

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

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

听起来你想使用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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM