【发布时间】:2022-01-10 17:16:46
【问题描述】:
我编写了一个简单的 c 程序,让每个线程将其索引乘以 1000000 并将其添加到 sum 中,我创建了 5 个线程,因此逻辑答案将是 (0+1+2+3+4)*1000000 即 10000000但它会抛出 14000000 。任何人都可以帮助我理解这一点吗?
#include<pthread.h>
#include<stdio.h>
typedef struct argument {
int index;
int sum;
} arg;
void *fonction(void *arg0) {
((arg *) arg0) -> sum += ((arg *) arg0) -> index * 1000000;
}
int main() {
pthread_t thread[5];
int order[5];
arg a;
for (int i = 0; i < 5; i++)
order[i] = i;
a.sum = 0;
for (int i = 0; i < 5; i++) {
a.index = order[i];
pthread_create(&thread[i], NULL, fonction, &a);
}
for (int i = 0; i < 5; i++)
pthread_join(thread[i], NULL);
printf("%d\n", a.sum);
return 0;
}
【问题讨论】:
-
修改了来自每个线程的共享对象(内存)本质上是不是线程安全的。
-
所以如果对象
index在线程之间共享意味着 4 ,3,2,1 和 0 都可以。所以说结果将乘以 5 =50000000 不是正确的吗?请如果你能给我写一个更清晰的答案,解释这个程序是如何产生 14000000 的,或者它是随机的。对不起,我很笨。