c++ - 多个线程可以读取同一个类成员变量吗?
问题描述
多个线程可以在不创建竞争条件的情况下安全地读取同一个类成员变量吗?
class foo {
int x;
};
void Thread1(foo* bar) {
float j = bar->x * 5;
}
void Thread2(foo* bar) {
float k = bar->x / 5;
}
因此,例如,如果我们有两个线程正在运行Thread1
,并且Thread2
. 如果每个线程都传递同一个 foo
对象,它们是否可以独立运行,没有竞争条件,因为我们只读取变量而不写入?还是访问对象的行为使整个事情变得不安全?
如果上面是安全的,第三个线程可以安全地写入同一个foo
对象,只要它不接触foo::x
?
#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 - %i\n", j);
}
void Thread2(foo* bar) {
int k;
for (int i = 0; i < 1000; i++) {
k = bar->x / 5;
}
printf("T2 - %i\n", k);
}
void Thread3(foo* bar) {
for (int i = 0; i < 1000; i++) {
bar->y += 3;
}
printf("T3 - %i\n", 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 %i\n", bar.x, bar.y);
return 0;
}
解决方案
推荐阅读
- label - 交易视图 pinescript 标签重叠
- powershell - Powershell:停止进程
- c# - 如何检查图标元素是否可见?
- c++ - 使用 DIPlib 进行垫圈测量
- python - 正则表达式模式匹配 terraform 模块代码
- javascript - 如何在express-js中将变量从一个路由传递到另一个路由
- shortest-path - GraphFrames Shortest Paths 给出距离而不是实际路径
- java - PDFBox - 关于如何创建表格视图
- android - Firestore 离线数据会在后台同步,还是在下次启动应用程序时同步?
- linux - 根据第 1 列合并多行