2017-05-10 78 views
0

我想理解爲什麼我得到這個答案,而我在線程中運行此代碼。 我不明白爲什麼我沒有得到不同的我每次價值。 enter image description here多線程打印值在一起

#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#define NUM_THREADS 5 

void *printHello(void *threadid) 
{ 
    int tid = *(int*)threadid; 

    printf("Hello World! It's me, thread #%d!\n", tid); 

    pthread_exit(NULL); 
} 

int main(int argc, char *argv[]) 
{ 
    pthread_t threads[NUM_THREADS]; 
    int rc; 
    int i; 

    for (i = 0; i < NUM_THREADS; i++) 
    { 
     printf("In main: creating thread %ld\n", i,); 

     rc = pthread_create(&threads[i], NULL, printHello, &i); 

     if (rc) 
     { 
      printf("ERROR; return code from pthread_create() is %d\n", rc); 
      exit(-1); 
     } 
    } 

    pthread_exit(NULL); 
} 

做所有的線程等待,直到他們完成創建他們,然後他們去printHello功能?

回答

1

當您創建新線程時,沒有固定的線程執行順序。主線程和新創建的線程將簡單地同時運行。

相對於你的i變量的問題是,你正在傳遞的i地址pthread_create功能。由於此變量在隨後的循環迭代中得到更新,因此當您通過其地址(來自printHello回調函數內)訪問它時,其值將發生變化。在您的輸出中,我們可以看到在main函數中的循環已經在任何產生的線程輸出任何內容之前完成,因爲i已經達到了NUM_THREADS限制。

如果你想要的東西是確定的,然後創建一個新的變量來保存線程ID,並在地址位置通過該線程,而不是:

int threadIds[NUM_THREADS]; 
int rc; 
int i; 

for (i = 0; i < NUM_THREADS; i++) 
{ 
    threadIds[i] = i; 
    rc = pthread_create(&threads[i], NULL, printHello, threadIds + i); 
} 

此外,主線程,直到所有的塊產生的線程已經完成執行,並且不會在main函數中調用pthread_exit。它不在pthread中運行,所以它不需要退出。

+0

謝謝。這是明確的答案 –