2016-11-15 60 views
2

我正在學習線程編程的過程,並且在您從pthread_create調用函數時已經運行測試練習以查看它是如何工作的,但是,在執行此操作時出現奇怪的結果。這裏是我的代碼:從線程打印時的值不一致

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <pthread.h> 

pthread_t *threads; 

typedef struct _file { 
    int num1; 
    int num2; 
} file; 

void thread_run(void *thing) { 
    file *fp = thing; 

    printf("num1: %d num2: %d\n", fp->num1, fp->num2); 

} 

int main(int argc, char **argv) { 

    threads = (pthread_t *)malloc(atoi(argv[1])); 

    file *args = malloc(sizeof(file)); 
    args->num1 = 0; 
    args->num2 = 0; 
    int i; 
    for (i = 0; i < atoi(argv[1]); i++) { 
     args->num1 = i; 
     args->num2 = i + 1; 
     pthread_create(&threads[i], NULL, (void *)thread_run, (void *)&args); // the (void *) cast is necessary on my linux distro 
    } 

    for (i = 0; i < atoi(argv[1]); i++) { 
     pthread_join(threads[i], NULL); 
    } 

    return 0; 
} 

什麼,我試圖在這裏,當我在for循環中,我將其全部保存在我的*線程指針創建線程的。

然後我調用帶有一個結構參數的thread_run方法,該結構參數包含兩個打印出來的整數值。

據我所知,這個計劃的預期輸出時./a.out 3運行應該是:

num1: 0 num2: 1 
num1: 1 num2: 2 
num1: 2 num2: 3 

不過,我正在輸出的每個時間不同,但通常是一致類似於:

num1: 34185264 num2: 0 
num1: 34185264 num2: 0 
num1: 34185264 num2: 0 

我已經注意到一些類似主題的問題,但沒有其他用戶似乎遇到我描述的問題。

回答

2

每個線程都有一個指向完全相同結構的指針。因此,他們將打印相同的值。對於for循環中的每個線程,您應該爲malloc()創建一個新結構。

另外,args被聲明爲file *args。請注意,這已經是一個指針了,所以你應該直接通過它而不是它的地址:

pthread_create(&threads[i], NULL, (void *)thread_run, (void *)args); 
+0

所以我應該在for循環中每次都有一個malloc? –

+2

此外,代碼將'&args'傳遞給'pthread_create()',它應該在那裏傳遞'args'。 –

+1

@NicholasDry是的,這是一個可能的解決方案 –