访问非共享资源时,C线程提供垃圾输出

时间:2016-07-23 23:22:50

标签: c multithreading pthreads

我正在学习如何在C中使用线程,并尝试使用工作函数(一个带有' void* helperFunc(void *arg)'签名)来调用常规函数并将其传递给地址数组中的整数。

有时,输出将是正确的(零列表)。其他时候,会有垃圾值而不是0。

所有线程都没有尝试访问共享资源,我相信我已正确地对数组进行了初始化,因此我不了解垃圾值的来源。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/types.h>
#include <unistd.h>

#define N 10

void runMe(int *arg) {
    printf("Hello %d\n", *arg);
}

void *helperFunc(void *arg){
    runMe((int*)arg);
}

int run_threads(void){
    pthread_t thread[N];
    int num[N] = {0};

    int i = 0;
    for (i = 0; i < N; i++){
        pthread_create(&(thread[i]), NULL, helperFunc, &(num[i]));
    }
}

int main(){
    run_threads();
    sleep(1);
    return 0;
}

预期产出:

Hello 0  
Hello 0  
Hello 0  
Hello 0  
Hello 0  
Hello 0  
Hello 0  
Hello 0  
Hello 0  
Hello 0  

实际输出:

Hello 0  
Hello 0  
Hello 0  
Hello 0  
Hello 0  
Hello 0  
Hello 32757  
Hello 4195339  
Hello 0  
Hello -334463544  

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

您正在向线程传递对象的地址,这些对象在访问时无法保证存在。只要run_threads返回,num就不再存在。