请考虑这种经典方法,我已对其进行了简化以突出显示确切的问题:
#include <iostream>
#include <mutex>
using namespace std;
class Test
{
public:
void modify()
{
std::lock_guard<std::mutex> guard(m_);
// modify data
}
private:
/// some private data
std::mutex m_;
};
这是使用 std::mutex
避免数据竞争的经典方法。
问题是为什么我们要在我们的类中保留一个额外的 std::mutex
?为什么我们不能每次都在std::lock_guard
声明之前这样声明呢?
void modify()
{
std::mutex m_;
std::lock_guard<std::mutex> guard(m_);
// modify data
}
最佳答案
假设两个线程并行调用modify
。所以每个线程都有自己的新互斥体。所以 guard
没有效果,因为每个守卫都锁定了不同的互斥量。您试图保护免受竞争条件影响的资源将会暴露。
关于c++ - 为什么我们保留互斥量而不是每次都在守卫之前声明它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49191966/