我了解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
}
问题是编译器生成了一个赋值运算符,该赋值运算符允许您分配类的对象,从而覆盖其内部数据。
这导致了潜在的种族。