![](/img/trans.png)
[英]Whats better std::lock_guard<std::mutex> lock(std::mutex mutex_var); or std::mutex mutex_var.lock();
[英]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_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
}
听起来你想使用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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.