#include<stdio.h>
#include<pthread.h>
#define NUM_THREAD (5)
int sum=0;
void* runner(void * param);
int main(int argc,char **argv){
pthread_t tid[NUM_THREAD];
pthread_attr_t attr;
pthread_attr_init(&attr);
for(i=0;i<NUM_THREAD;i++){
pthread_create(&tid[i],&attr,runner,NULL);
}
for(i=0;i<NUM_THREAD;i++){
pthread_join(tid[i],NULL);
}
printf("After threading %d",sum);
return 0;
}
void * runner(void *param){
for(int j = 0;j<10;j++) sum+=j;
pthread_exit(0);
}
输出:225
在下面的代码中,输出是225。但正确的应该是45
我知道线程共享全局变量!。所以这个函数应该正确输出。但是在里面添加 sum=0 只会给出正确的输出。这里发生了什么我不明白!
void * runner(void *param){
sum=0; // MY DOUBT
for(int j = 0;j<10;j++) sum+=j;
pthread_exit(0);
}
输出:45
最佳答案
您有data race因为 sum
被所有线程访问/修改,没有任何同步。所以45和225都是“错误的”。您可能会在不同的运行中看到不同的值。您需要synchronize对 sum
的访问。
另一件事需要注意,您尚未初始化传递给 pthread_create
的 attr
。您需要使用 pthread_attr_init
对其进行初始化。
关于c - 多个线程更新同一变量时出现意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47652197/