我了解C++可以防止多线程环境中的数据竞争,我们可以在类中添加mutex

但是,如果下面有一个简单的类,它只有一个get()方法,我们是否仍需要考虑线程安全性的问题?

class SimpleClass {
public:
  SimpleClass(int val) : v(val) {};
  int get() { return v; }
private:
  int v;
};

最佳答案

您的代码不安全,并且有潜在的竞争条件。

class SimpleClass {
public:
  SimpleClass(int val) : v(val) {};
  int get() { return v; }
private:
  int v;
};

void thread_1(SimpleClass& sc)
{
    std::cout << sc.get() << '\n';
}

void thread_2(SimpleClass& sc)
{
    SimpleClass other(5);
    sc = other; // potential race
}

问题是编译器生成了一个赋值运算符,该赋值运算符允许您分配类的对象,从而覆盖其内部数据。

这导致了潜在的种族。

10-08 03:22