2016-10-04 48 views
0

這個問題是在pthread_create的聲明:上在pthread_join(),並在pthread_create()

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void * 
      (*start_routine) (void *), void *arg); 

它包含一個函數的start_routine。

所以,當我們調用pthread_create時,函數將執行param arg。
那麼爲什麼有必要調用pthread_join(),因爲要執行start_routine函數?
我也試過不包含pthread_join()函數,事實上start_routine函數根本沒有執行,並且進程在創建後才退出。
所以當程序來到pthread_create時,它究竟會發生什麼? param start_routine的執行是否有條件?
混亂... 這裏是我的測試代碼:

#include <pthread.h> 
#include <stdio.h> 
int sum; 
void* runner(void *param); 

int main(int argc, char *argv[]) 
{ 
    pthread_t tid; //The thread identifier 
    pthread_attr_t attr;//set of thread attributes 

    if(argc!=2){ 
    fprintf(stderr, "usage:a.out <integer value>\n"); 
    return -1; 
    } 
    if(atoi(argv[1])<0){ 
    fprintf(stderr, "%d must be <=0\n",atoi(argv[1])); 
    return -1; 
    } 


    //get the default attributes 
    pthread_attr_init(&attr); 
    //create the thread 
    pthread_create(&tid,&attr,runner,argv[1]); 
    //now wait for the thread to exit 
    pthread_join(tid,NULL); 

    printf("sum=%d\n", sum); 
} 

    void* runner(void *param) 
    { 
     int i,upper = atoi(param); 
     sum=0; 

     for(i=1;i<=upper;i++) 
      sum+=i; 

     pthread_exit(0); 
    } 

回答

0
  1. 通常,你的例程將被調用。如果它沒有任何要做和退出,你的線程生活就完成了。
  2. 你的start_routine()是否有任何代碼/打印語句可以用來驗證/調試它的功能?
  3. 調用pthread_join()不是必需的。如果你想在start_routine()完成/終止執行(內部/外部)之後等待start_routine(),這將是必需的。並檢查線程函數的返回狀態。
  4. 線程不運行的其他場景可能是:系統內存非常少,或者現有線程(及其優先級)佔用系統太多,以至於無法運行。
  5. 你還檢查了pthread_create()的錯誤代碼嗎?

如果你能分享你的測試代碼,包括pthread_create()和start_routine()的調用者,它將會有所幫助。

+0

謝謝!我分享了我的測試代碼,並且我想等待總和計算。我只是想知道如何創建包含連接函數?難道它不應該讓跑步者毫不例外地計算嗎?如果我取消了連接函數,那麼和的值就會保持爲0,這意味着create函數沒有執行runner來計算,這與join函數有關,對嗎? – BobHU

0

如果退出之前在pthread_join的應用程序或進程,該進程將不會等待start_routine應用程序來完成執行。它只會殺死所有的資源