看起来像scoped_lock在 c++17 中提供了我所追求的功能,但是我目前与 c++11 相关联。
目前,当我们多次使用同一个互斥量调用 guard_lock 时,我发现它会出现死锁问题。 scoped_lock 是否防止多次调用(即重入?)? 在带有 lock_guard 的 c++11 中执行此操作是否有最佳实践?
mutex lockingMutex;
void get(string s)
{
lock_guard<mutex> lock(lockingMutex);
if (isPresent(s))
{
//....
}
}
bool isPresent(string s)
{
bool ret = false;
lock_guard<mutex> lock(lockingMutex);
//....
return ret;
}
最佳答案
为了能够多次锁定同一个互斥锁,需要使用 std::recursive_mutex .递归互斥体比非递归互斥体更昂贵。
不过,最佳做法是以线程不会多次锁定同一个互斥量的方式设计代码。例如,您的公共(public)函数是否先锁定互斥锁,然后调用期望互斥锁已被锁定的实现函数。实现函数不得调用锁定互斥量的公共(public) API 函数。例如:
class A {
std::mutex m_;
int state_ = 0;
private: // These expect the mutex to have been locked.
void foo_() {
++state_;
}
void bar_() {
this->foo_();
}
public: // Public functions lock the mutex first.
void foo() {
std::lock_guard<std::mutex> lock(m_);
this->foo_();
}
void bar() {
std::lock_guard<std::mutex> lock(m_);
this->bar_();
}
};
关于c++ - 如何使用 lock_guard 在 c++11 中实现 scoped_lock 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52988631/