首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确保当前线程持有C++11互斥锁。

确保当前线程持有C++11互斥锁。
EN

Stack Overflow用户
提问于 2015-03-03 06:51:01
回答 2查看 3.8K关注 0票数 7

是否有一种方法可以判断C++11中的当前线程是否持有互斥锁?特别是,我希望确保类中的某些函数只在调用线程持有对象的锁(通过std::lock_guardstd::unique_lock或类似的方法)时调用,而std::mutex是成员变量。

为了避免在大量使用对象时重复锁定和解锁,锁定mutex的责任需要由调用方负责,不能在每个单独的函数中执行,而且如果当前线程在调用这些函数时没有锁定mutex,我想抛出一个异常。

看来,我不能只使用std::try_lock,并在必要时使用解锁,因为如果当前线程已经持有锁,则std::try_lock的行为是未定义的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-03 17:49:03

我建议这样做的方法是,只有在保存互斥对象时才能调用函数,并引用std::unique_lockstd::lock_guard。对于unique_lock,您可能还想断言它实际上持有锁。

这将利用编译器强制执行您的需求。

假设这些函数对您的类是内部的/私有的,并且您有面向用户的函数来获取锁,然后调用这些锁。如果是这样的话,增加一个参数不会污染面向API的用户。

类似于这样的东西:

代码语言:javascript
复制
// 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()在您的函数中是真的(以防您想抛出异常)。

我使用递归互斥的经验是,它们可以使您的锁策略和所有权不像它应有的那样严肃。他们可能会在稍后咬你。见帖子。

票数 6
EN

Stack Overflow用户

发布于 2015-03-03 08:46:43

只需在代码中使用递归互斥和锁/解锁,就像在没有高级锁保证的情况下那样。然后向可以使用(或不使用)调用代码的人提供mutex

最重要的是,如果上层不锁定,您的代码仍将完美地工作,尽管速度可能会降低。如果上层确实锁定了,这将仅仅是一个检查,如果它拥有锁和一个refcount增量/减少,类似于您计划做的事情。

C++标准库中没有(当前)定义的接口,它允许您检查互斥锁是否被锁定,并且您是所有者。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28825749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档