2010-02-10 149 views
1

Basicly這是我有:C++困惑線程

Server:: 
Server (int port) { 
    cout << "Initializing server.\n"; 

    (...)  

    pthread_t newthread; 
    pthread_create(&newthread, NULL, &Server::_startListening, NULL); 

    cout << "Exit\n"; 
    pthread_exit(NULL); // <-- Question 
} 

void* Server::_startListening (void* param) { 
cout << "Start listening for clients ...\n"; 
return 0; 
} 

問題: 如果我不把了pthread_exit(NULL);在代碼中,當我在Linux(Ubuntu)上編譯它時,它將工作,但它不適用於Mac OSX 10.6.2。當我在Linux上編譯並運行它時,它會說初始化服務器,開始監聽客戶端,在Mac OSX上退出時它會說服務器初始化,退出,開始監聽客戶端。

這個問題似乎發生在pthread_exit的周圍,如果我把它放在cout的上方< < Exit。該消息將永遠不會顯示(這有多奇怪)。

我做錯了什麼?

+0

你期望什麼'pthread_exit(NULL);'做什麼? – 2010-02-10 02:04:47

+0

但是,如果沒有提供pthread_exit或pthread_join,爲什麼Mac OS會忽略該線程? – Mark 2010-02-10 10:17:48

回答

7

您可能打算使用pthread_join而不是退出。

3

這個問題似乎發生在pthread_exit周圍,如果我把它放在cout之上< < Exit。該消息將永遠不會顯示(這有多奇怪)。

不奇怪的。當你調用pthread_exit時,當前線程停止執行。由於只有在該線程中您將顯示「退出」,所以一旦該線程消失,就沒有什麼可以打印它了。

關於「退出」和「開始聆聽」的打印順序不同。這些中的每一個都由單獨的線程打印。因爲你沒有同步,所以可以先打印。

0

線程(調度等)依賴於操作系統。它看起來像在Linux上,操作系統在繼續執行主線程之前將上下文切換到新線程,而在Mac OS上,它將在切換上下文之前繼續執行當前線程。因爲這取決於操作系統,所以除非你進行某種同步,否則沒有可靠的方法來確定首先執行哪個線程的兩個線程,甚至你測試過的'linux會切換上下文'的結果是不可靠的。

如上所述,pthread_exit退出活動當前線程(即:main()),而不是任何其他線程(_startListning)。您可能正在尋找加入(pthread_join)另一個線程,而不是退出當前。

1

您的輸出的排序是不確定的。這就是併發意味着什麼!另外兩個答案是正確的:pthread_exit在你的輸出殺死主線程之前,你可能打算在主要退出發生之前加入。

0

pthread_exit應該從您想要停止的線程調用。從main()線程調用它將終止主線程,並且程序將運行直到偵聽線程退出。

建議您在pthread_exitpthread_join閱讀手冊頁。

0

我認爲你的問題已經回答了上面,但你也可能想看看了Boost線程庫,這將給你更容易的跨平臺化,你應該永遠去到Windows,加上一個不錯的面向對象的接口。