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如果当前线程已经持有锁,则行为是未定义的.
我建议这样做的方法是让只能在持有互斥锁时调用的函数引用 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()在您的函数中断言它为真(以防您想抛出异常)。
我对递归互斥锁的经验是,它们很容易让你的锁策略和所有权不那么严肃。而且他们以后可能会咬你。看到这个帖子。
| 归档时间: |
|
| 查看次数: |
2155 次 |
| 最近记录: |