作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 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
}
问题是编译器生成了一个赋值运算符,允许您的类的对象被赋值,这会覆盖它们的内部数据。
这会导致潜在的竞争。
关于c++ - 我们是否需要对只有 read 方法的类进行线程安全设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41416206/
我是一名优秀的程序员,十分优秀!