我有一种情况,我想做下面所示的事情,但似乎没有办法在不改变状态的情况下查询互斥锁。我不希望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
}
}
答案 0 :(得分: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
}
答案 1 :(得分:0)
听起来你想使用std :: unique_lock而不是std :: lock_guard。 try_lock方法的工作方式类似于Windows上的TryEnterCriticalSection,该函数将自动获取锁,如果可以,则返回'true',如果无法获取锁定,则返回'false'(并且不会阻塞)。请参阅http://msdn.microsoft.com/en-us/library/hh921439.aspx和http://en.cppreference.com/w/cpp/thread/unique_lock/try_lock。请注意,unique_lock还有其他可用于尝试锁定的成员,例如try_lock_for和try_lock_until。