多个线程可以读取同一个类成员变量吗?



多个线程是否可以安全地读取相同的类成员变量而不创建争用条件?

class foo {
int x;
};
void Thread1(foo* bar) {
float j = bar->x * 5;
}
void Thread2(foo* bar) {
float k = bar->x / 5;
}

因此,例如,如果我们有两个线程运行Thread1Thread2.如果每个线程都传递相同的foo对象,它们是否可以独立运行,没有竞争条件,因为我们只读取变量而不写入?还是访问对象的行为使整个事情变得不安全?

如果上述是安全的,那么只要不接触foo::x,第三个线程是否可以安全地写入同一个foo对象?

#include <thread>
class foo {
public:
int x = 1;
int y = 1;
};
void Thread1(foo* bar) {
int j;
for (int i = 0; i < 1000; i++) {
j = bar->x * 5;
}
printf("T1 - %in", j);
}
void Thread2(foo* bar) {
int k;
for (int i = 0; i < 1000; i++) {
k = bar->x / 5;
}
printf("T2 - %in", k);
}
void Thread3(foo* bar) {
for (int i = 0; i < 1000; i++) {
bar->y += 3;
}
printf("T3 - %in", bar->y);
}
int main() {
foo bar;
std::thread t1(Thread1, &bar);
std::thread t2(Thread2, &bar);
std::thread t3(Thread3, &bar);
t1.join();
t2.join();
t3.join();
printf("x %i, y %in", bar.x, bar.y);
return 0;
}

多个线程可以安全地读取同一个类成员变量吗 不创建竞争条件?

是和不是。

- 您提供的代码不会导致争用条件,因为当您至少有 2 个线程在同一共享资源上工作,并且其中至少有一个线程正在写入该资源时,可能会出现争用条件。

- 您的代码不被视为线程安全的,因为它公开了 x 和 y 成员以进行读取和写入,并且(对于您或使用您的代码的其他程序员(可能导致争用条件。 你依赖于你的知识(随着时间的推移,你可能会忘记(,x应该只被读取,而不是写入,y应该只由一个线程写入。应通过在关键代码部分中创建互斥来强制实施此操作。

如果希望线程仅从 x 和 y 读取,则应使此类不可变。

最新更新