簡體   English   中英

C ++對線程感到困惑

[英]C++ Confused about Threads

基本上這就是我所擁有的:

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上,它將說“正在初始化服務器,退出,開始偵聽客戶端”。

如果我將其放置在cout << Exit上方,則問題似乎出現在pthread_exit周圍。 該消息將永遠不會顯示(這有多怪異)。

難道我做錯了什么?

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

如果我將其放置在cout << Exit上方,則問題似乎出現在pthread_exit周圍。 該消息將永遠不會顯示(這有多怪異)。

一點也不奇怪。 調用pthread_exit時,當前線程停止執行。 由於只在該線程中顯示“退出”,因此一旦該線程消失,就沒有任何可打印的內容了。

關於打印“退出”和“開始收聽”的不同順序。 每一個都由單獨的線程打印。 因為沒有同步,所以任何一個都可以先打印。

您的輸出順序不確定。 這就是並發的意思! 另外兩個答案是正確的:pthread_exit在輸出終止主線程之前,並且您可能打算在主出口出現之前加入。

線程(調度等)取決於操作系統。 看起來在Linux上,您的OS在繼續進入主線程之前將上下文切換到新線程,而在Mac OS上,它將在切換上下文之前繼續執行當前線程。 因為這是依賴於OS的,否則除非進行某種同步,否則就沒有可靠的方法來告訴兩個線程中的哪一行將首先執行,甚至經過測試的“ Linux將切換上下文”結果也不可靠。

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

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

建議您閱讀pthread_exitpthread_join的聯機幫助頁。

我認為您的問題已經在上面回答了,但是您可能還希望研究Boost線程庫,如果您使用Windows,它會為您提供更輕松的跨平台支持,以及一個不錯的面向對象的界面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM