2016-11-09 44 views
0

我正在學習Linux平臺中的多線程。我寫了這個小程序,以獲得舒適的概念。在運行可執行文件時,我看不到任何錯誤,也不打印Hi。因此,我看到輸出後就讓睡覺了。但仍然無法看到控制檯上的打印件。Linux多線程 - 線程不會按預期產生任何輸出

我也想知道在運行時打印哪個線程。誰能幫我?

#include <iostream> 
#include <unistd.h> 
#include <pthread.h> 

using std::cout; 
using std::endl; 

void* print (void* data) 
{ 
     cout << "Hi" << endl; 
     sleep(10000000); 
} 

int main (int argc, char* argv[]) 
{ 
    int t1 = 1, t2 =2, t3 = 3; 
    pthread_t thread1, thread2, thread3; 
    int thread_id_1, thread_id_2, thread_id_3; 
    thread_id_1 = pthread_create(&thread1, NULL, print, 0); 
    thread_id_2 = pthread_create(&thread2, NULL, print, 0); 
    thread_id_3 = pthread_create(&thread3, NULL, print, 0); 
    return 0; 
} 
+0

此外,你意識到你讓它睡了100多天,對吧? – AntonH

+1

睡100天沒什麼問題。我每天晚上都做。 –

+0

的確如此,但我一直在考慮操作系統可能不會刷新緩衝區並打印「Hi」,然後OP會終止程序,因此無法打印。 – AntonH

回答

1

您的主線程可能已退出,因此整個過程都會死亡。所以,線程沒有機會運行。如果線程在主線程退出之前完成執行,那麼即使使用代碼,也可能(很不可能,但仍有可能)您會看到線程的輸出。但你不能依賴這一點。

呼叫pthread_join(),其中掛起調用線程,直到線程(由線程ID指定)在pthread_create()電話後返回,在線程的main():

pthread_join(thread1, NULL); 
pthread_join(thread2, NULL); 
pthread_join(thread3, NULL); 

您還可以使用數組pthread_t這將允許您在調用pthread_create()pthread_join()時使用for循環。

或者退出只有主線程使用pthread_exit(0),這將只退出調用線程和其餘線程(你創建的)將繼續執行。

注意,你的線程函數返回一個指針或NULL:

void* print (void* data) 
{ 
    cout << "Hi" << endl; 
    return NULL; 
} 

不能確定的高睡覺要麼是根據線程退出,這是不必要的,會從退出持有的線程。可能不是你想要的東西。

+0

謝謝P.P.它爲我工作。我認爲創建的線程運行速度很快,因此我甚至無法看到打印內容,因此我將睡眠時間放在打印功能中。沒有想到主線程。 – funwithlinx

+0

pthread_detach也適用於這種情況。 – Jonathan

+0

@Jonathan號問題將保持不變。 'pthread_detach()'只是告訴pthreads庫沒有人等待它,並且一旦線程返回/退出,它的資源就可以立即釋放。但是,如果主線程退出(通過'exit')或從主線程返回(在這種情況下,進程終止),它無法提供幫助。 –