2013-05-29 69 views
0

我目前正在實習並要求使用C++編寫多客戶端服務器客戶端應用程序。因此,我試圖學習線程。有一個問題:C++中的線程使用情況

我想打印「你在線程A」,然後「你在線程B」,「現在你又回到了線程A」。但它只打印前兩個句子並忽略endl命令。無法準確理解它是如何工作的。如何解決這個問題,你能簡要解釋一下工作機制嗎?

爲什麼主線程在所有函數調用完成之前退出?

void * function1(void * arg); 
void * function2(void * arg); 


pthread_t thr_A, thr_B; 
int main(void) 
{ 

    pthread_create(&thr_A, NULL, function1, (void*)thr_B); 
    pthread_create(&thr_B, NULL, function2,NULL); 

return 0; 

} 

void * function1(void * arg) 
{ 

    cout << "You are in thread A" << endl; 
    pthread_join(thr_B, NULL); 
    cout << "now you are again in thread A" << endl; 
    pthread_exit((void*)thr_A); 


} 

void * function2(void * arg) 
{ 
    cout << " you are in thread B " << endl ; 
    pthread_exit((void*)thr_B); 
} 
+3

如果你被要求使用C,那麼你爲什麼要使用C++?如果您使用C++,爲什麼不使用標準線程庫? –

回答

1

在你的main函數中你創建了一個競爭條件。線程可以以任意順序啓動,除非您專門同步代碼,以便強制啓動其中一個或另一個。因此,也不可能知道哪一個會先完成。然後,您還擁有主線程,甚至可以在您創建的線程完成之前完成。使用pthread時,您必須調用pthread_join以等待線程完成。根據因爲https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal 你也應該從功能一個刪除在pthread_join:你可以是這樣做的:

int main(void) 
{ 
    // you pass thread thr_B to function one but 
    // function2 might even start before function1 
    // so this needs more syncronisation 
    pthread_create(&thr_A, NULL, function1, (void*)thr_B); 
    pthread_create(&thr_B, NULL, function2,NULL); 

    //this is mandatory to wait for your functions 
    pthread_join(thr_A, NULL); 
    pthread_join(thr_B, NULL); 

    return 0; 

} 

,才能在FUNCTION1等待你需要例如更先進的同步方法見例如pthread_cond_waitpthread_cond_signal作爲解釋man pthread join:「如果多個線程同時嘗試使用相同的線程加入,則結果不確定。」 大衛hammen的評論

編輯

void * function1(void * arg) 
{ 

    cout << "You are in thread A" << endl; 
    //Remove the next line and replace by a pthread_cond_wait. 
    pthread_join(thr_B, NULL); 
    cout << "now you are again in thread A" << endl; 
    pthread_exit((void*)thr_A); 

} 
+0

這正是我想要的。謝謝。 – nihirus

+0

@nihirus如上所述,如果決定使用C++而不是C,請參閱本教程。 http://www.devx.com/SpecialReports/Article/38883它可能會節省一些工作,並且更適合於C++,儘管正確使用pthreads可以完成這項工作。如果您認爲我的帖子非常有幫助,您可能想爲未來的用戶接受我的答案。 – hetepeperfan

+0

發佈的代碼是未定義的行爲:*如果pthread_join()的線程參數指定的值沒有引用可連接的線程,[pthread_join()]的行爲是未定義的。*在這種情況下,'thr_B'不可連接在'main()'中,因爲'function1'已經調用'pthread_join(thr_B,NULL);'解決方法是在這個答案中刪除對'pthread_join()'的第二次調用。 –