c++ - 为什么我们保留互斥量而不是每次都在守卫之前声明它?

标签 c++ multithreading c++11 mutex race-condition

请考虑这种经典方法,我已对其进行了简化以突出显示确切的问题:

#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/

相关文章:

c++ - 静态库问题中的资源

java - 在多线程环境中使用 DateFormat 时使用 synchronized 关键字

multithreading - golang写文件阻塞了很多goroutine,为什么不创建很多线程?

java - 在主线程之外更新UI

c++ - 作为左值引用或右值拷贝的数据成员

c++ - std::regex_match 和 std::regex_search 之间的区别?

C++ 对象 block 分配与单独分配

c++ - 如何在Linux中编译隐藏源文件的C++代码?

c++ - 查找 Visual C++ 工具的包含 Visual Studio 2017 的文件夹位置

c++ - 在 std::array 中的元素上调用用户定义的构造函数