如何断言std :: mutex是否已锁定?
使用GCC 4.8.2(在Linux / Debian / Sid 64位上)或GCC 4.9(在C ++ 11中可用)-我有一些互斥锁
std::mutex gmtx;
实际上,它是static
某个类的成员,Foo
同时包含下面的alpha
和beta
方法。
它被锁定alpha
像
void alpha(void) { std::lock_guard<std::mutex> g(gmtx);
beta(void);
// some other work
}
我想检查beta
一下确实gmtx
被锁定了:
void beta(void) { assert (gmtx.is_locked());
// some real work
}
(is_locked
仅在内部调用的通知assert
。。。效率可能非常低下,有时甚至不准确)
当然,我还有其他函数调用beta
,例如
void gamma(void) { std::lock_guard<std::mutex> g(gmtx);
beta();
// some other work
}
但is_locked
不存在。…我应该如何定义它?(实际上,我想确保互斥体已被某些[间接]调用者锁定在同一线程中。)
(我要测试的原因assert
是beta
可以在其他地方调用)
我不能使用try_lock
(除非使用递归互斥锁),因为在通常情况下,它将锁定一个已经锁定的互斥锁…(由调用方锁定在同一线程中),这不仅是未定义的行为,而且是完全阻塞的。
除非确实需要,否则我想避免使用递归互斥锁(比普通互斥锁更昂贵)。
注意:真正的程序要复杂一些。实际上,所有方法都在一个类中,该类维护“项目”上的命名双向关系。所以我在该类中有一个从项目到名称的映射,另一个是从名称到项目的映射。beta
将内部方法添加一个真正的命名,并alpha
和gamma
会发现它的名称,或通过其项目的名称-
或加入-一个项目的方法。
PS:真正的程序尚未发布,但应该成为MELT的一部分-
将来的监视器;您可以从此处(一个临时位置)下载它(Alpha舞台,非常容易出错)
回答:
std::unique_lock<L>
具有owns_lock
成员函数(相当于is_locked
您所说的)。
std::mutex gmtx;std::unique_lock<std::mutex> glock(gmtx, std::defer_lock);
void alpha(void) {
std::lock_guard<decltype(glock)> g(glock);
beta(void);
// some other work
}
void beta(void) {
assert(glock.owns_lock()); // or just assert(glock);
// some real work
}
在此解决方案中,所有锁定操作应通过unique_lock
glock
而不是“原始”互斥锁执行gmtx
。例如,alpha
用lock_guard<unique_lock<mutex>>
(或简单地lock_guard<decltype(glock)>
)重写成员函数。
以上是 如何断言std :: mutex是否已锁定? 的全部内容, 来源链接: utcz.com/qa/429999.html