2016-07-23 70 views
0

我正在學習如何在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 

任何幫助,將不勝感激。

回答

2

你傳入線程不能保證,當他們訪問它存在一個對象的地址。只要run_threads返回,num不再存在。

+0

謝謝。我已經通過使用malloc來爲整數分配空間來糾正問題。 –

+1

@ChrisJolly:如果你打算做任何事情與陣列有用,你需要考慮一下返回,以便它可以被釋放,並擔心你將如何等待線程退出('睡眠(1)'笨拙 - ''pthread_join()'?)等等。也許這就是未來;讓它乾淨地工作是一個開始。 –

+0

謝謝。我已經返回使用int數組,並且使用pthread_join來允許它們在run_threads返回之前完成執行。 –