确保当前线程锁定C++ 11互斥锁

mar*_*964 5 c++ multithreading mutex locking c++11

有没有办法判断C++ 11中的当前线程是否锁定互斥锁?我特别希望确保在一类特定的功能而调用线程持有到锁仅称为(通过std::lock_guard,std::unique_lock或类似的东西)为对象,与std::mutex作为一个构件的变量.

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

似乎我不能在std::try_lock必要时使用后跟解锁,因为std::try_lock如果当前线程已经持有锁,则行为是未定义的.

Arv*_*vid 6

我建议这样做的方法是让只能在持有互斥锁时调用的函数引用 a std::unique_lockor 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
}
Run Code Online (Sandbox Code Playgroud)

如果您需要unique_lock改用,只需l.owns_lock()在您的函数中断言它为真(以防您想抛出异常)。

我对递归互斥锁的经验是,它们很容易让你的锁策略和所有权不那么严肃。而且他们以后可能会咬你。看到这个帖子。