是否有一种方法可以判断C++11中的当前线程是否持有互斥锁?特别是,我希望确保类中的某些函数只在调用线程持有对象的锁(通过std::lock_guard、std::unique_lock或类似的方法)时调用,而std::mutex是成员变量。
为了避免在大量使用对象时重复锁定和解锁,锁定mutex的责任需要由调用方负责,不能在每个单独的函数中执行,而且如果当前线程在调用这些函数时没有锁定mutex,我想抛出一个异常。
看来,我不能只使用std::try_lock,并在必要时使用解锁,因为如果当前线程已经持有锁,则std::try_lock的行为是未定义的。
发布于 2015-03-03 17:49:03
我建议这样做的方法是,只有在保存互斥对象时才能调用函数,并引用std::unique_lock或std::lock_guard。对于unique_lock,您可能还想断言它实际上持有锁。
这将利用编译器强制执行您的需求。
假设这些函数对您的类是内部的/私有的,并且您有面向用户的函数来获取锁,然后调用这些锁。如果是这样的话,增加一个参数不会污染面向API的用户。
类似于这样的东西:
// public
void A::public_function() {
std::lock_guard<std::mutex> l(m_mutex);
// ... do stuff
b(l);
// ... do more stuff
}
// private
void A::b(std::lock_guard const& l) {
// ... do stuff that requires holding the mutex
}如果您需要使用unique_lock,只需断言l.owns_lock()在您的函数中是真的(以防您想抛出异常)。
我使用递归互斥的经验是,它们可以使您的锁策略和所有权不像它应有的那样严肃。他们可能会在稍后咬你。见这帖子。
发布于 2015-03-03 08:46:43
只需在代码中使用递归互斥和锁/解锁,就像在没有高级锁保证的情况下那样。然后向可以使用(或不使用)调用代码的人提供mutex。
最重要的是,如果上层不锁定,您的代码仍将完美地工作,尽管速度可能会降低。如果上层确实锁定了,这将仅仅是一个检查,如果它拥有锁和一个refcount增量/减少,类似于您计划做的事情。
C++标准库中没有(当前)定义的接口,它允许您检查互斥锁是否被锁定,并且您是所有者。
https://stackoverflow.com/questions/28825749
复制相似问题