c - 多个线程更新同一变量时出现意外输出

标签 c multithreading pthreads

#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都是“错误的”。您可能会在不同的运行中看到不同的值。您需要synchronizesum 的访问。

另一件事需要注意,您尚未初始化传递给 pthread_createattr。您需要使用 pthread_attr_init 对其进行初始化。

关于c - 多个线程更新同一变量时出现意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47652197/

相关文章:

c - 将结构写入文件但读取不正确

ios - Async_Dispatch 线程

c - 是否有必要调用 pthread_join()

c++ - 在运行时删除持有 pthread 的变量

android - 使用线程更改 ImageView 中的图像

c - 从另一个线程杀死一个线程

c - 赋值 = 和减法赋值 -= C 中的原子操作?

c - C链表结构中的未知类型名称

c - 在 C 中初始化字符串的正确方法

multithreading - 使用 python psycopg2 : multiple cursors (1 per thread) on same connection