2011-06-24 222 views
11

在下面的代碼中,我創建了一些線程數,每個線程休眠幾秒鐘。使主程序等待線程完成

但是,我的主程序不會等待線程完成,我假設線程將繼續運行,直到他們自己完成。

即使調用線程完成,是否還有線程繼續運行。

#include <pthread.h> 
#include <iostream> 
#include <cstdio> 
#include <cstdlib> 


int sample(int min,int max){ 
    int r=rand(); 
    return (r %max+min); 
} 



void *worker(void *p){ 
    long i = (long) p; 
    int s = sample(1,10); 
    fprintf(stdout,"\tid:%ld will sleep: %d \n",i,s); 
    sleep(s); 
    fprintf(stdout,"\tid:%ld done sleeping \n",i,s); 
} 

pthread_t thread1; 

int main(){ 
    int nThreads = sample(1,10); 

    for(int i=0;i<nThreads;i++){ 
    fprintf(stderr,"\t-> Creating: %d of %d\n",i,nThreads); 
    int iret1 = pthread_create(&thread1, NULL, worker, (void*) i); 
    pthread_detach(thread1); 
    } 
    // sleep(10);//work if this is not commented out. 
    return 0; 
} 

感謝

編輯:

對不起,不澄清,這可能沒有明確地跟蹤我的當前運行的線程,並通過加入。

+0

如果這是一個圖形化的用戶界面,是的,這將是真實的,因爲有一個消息循環。您必須有條件繼續運行,直到所有線程完成爲止,例如加入。 – 2011-06-24 12:43:10

回答

3

每個程序都有一個主線程。它是main()函數執行的線程。當該線程的執行完成時,程序將與其所有線程一起完成。如果您希望主線程等待其他線程,則必須使用pthread_join函數

+0

當主線程執行結束時,至少在Linux下程序/進程不會終止,而是作爲殭屍運行,直到其他線程完成,然後程序/進程結束。爲了檢查這一點,編寫一個只休眠N秒的線程,然後從主線程創建線程,然後從主線程發出pthread_exit(0),並在殭屍狀態下監視進程,然後在N秒後線程完成這也會觸發程序/過程完成。 – user1656730

2

您需要跟蹤線程。你不這樣做,因爲你正在創建的每個線程使用相同的thread1變量。

您可以通過創建一個pthread_t類型的列表(或數組)來跟蹤線程,該類型將傳遞給pthread_create()函數。那麼你pthread_join()列表中的那些線程。

編輯:

嗯,這是真的懶的你要不要繼續運行的線程的軌道。但是,您可以通過讓一個全局變量(受互斥鎖保護)在線程完成之前得到遞增來完成所需的任務。然後在你的主線程中,你可以檢查該var是否達到你想要的值。在你的示例代碼中說nThreads

+0

如果使用第二種解決方案,不要忘記對變量的所有訪問都必須進行同步。 –

2

您需要您共創每個線程:你知道你的假設是錯誤的

int main() 
{ 
    int     nThreads = sample(1,10); 
    std::vector<pthread_t> threads(nThreads); 

    for(i=0; i<nThreads; i++) 
    { 
      pthread_create(&threads[i], NULL, worker, (void*) i) 
    } 

    /* Wait on the other threads */ 
    for(i=0; i<nThreads; i++) 
    { 
      status* status; 
      pthread_join(threads[i], &status); 
    } 
} 
1

。主要是特別的。退出main會殺死你的線程。因此,有兩種選擇:

  1. 使用pthread_exit退出爲主。此函數將允許您退出main,但保持其他線程在運行。

  2. 做一些事情來保持活力。這可以是任何從循環(愚蠢和低效)到任何阻塞呼叫。 pthread_join是很常見的,因爲它會阻塞,但如果你感興趣的話,還可以給你線程的返回狀態,並清理死線程資源。但爲了防止主要終止任何阻塞呼叫,例如,選擇,讀管道,一個信號量塊等

由於馬丁表現join(),這裏的pthread_exit()

int main(){ 
    int nThreads = sample(1,10); 

    for(int i=0;i<nThreads;i++){ 
    fprintf(stderr,"\t-> Creating: %d of %d\n",i,nThreads); 
    int iret1 = pthread_create(&thread1, NULL, worker, (void*) i); 
    pthread_detach(thread1); 
    } 

    pthread_exit(NULL); 
}