c++ - 确保当前线程持有 C++11 互斥锁

标签 c++ multithreading c++11 locking mutex

有没有办法判断 C++11 中的当前线程是否持有互斥锁?特别是我想确保类中的某些函数仅在调用线程持有锁时被调用(通过 std::lock_guardstd::unique_lock 或类似的东西)对于对象,std::mutex 是一个成员变量。

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

看来我不能只使用 std::try_lock 然后根据需要进行解锁,因为如果当前线程 std::try_lock 的行为是未定义的已经持有锁。

最佳答案

我建议这样做的方法是让只能在持有互斥锁时调用的函数引用 std::unique_lockstd::lock_guard。在 unique_lock 的情况下,您可能还想断言它实际上持有锁。

这将利用编译器来执行您的要求。

大概这些函数是您的类的内部/私有(private)函数,并且您有面向用户的函数获取锁然后调用这些函数。如果是这样,有一个额外的参数不会污染面向用户的 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() 在您的函数中为真(以防您想要抛出异常)。

我对递归互斥锁的经验是,它们很容易让你不认真对待你的锁策略和所有权。而且他们以后可能会咬你。参见 this发布。

关于c++ - 确保当前线程持有 C++11 互斥锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28825749/

相关文章:

c++ - (char*)&obj 替代品

c++ - “stoi”未在此范围内声明

c++ - 从函数返回一个带有值模板参数的类模板

Java ConcurrentHashSet - 在多线程环境中迭代它

java - netty DefaultChannelPipeline异常捕获

java - 在 Java 中创建线程的肮脏方法

c++ - 合理支持的最低 GCC 版本是多少?

c++ - 多线程 TCP 网络的性能

c++ - constexpr 静态成员变量的链接器错误

c++ - 将一行数字数据读入一个数组,然后将下一行读入一个变量。 C++