2013-05-11 49 views
3

問題1: 我讀到,當你調用創建線程阻塞調用它,直到線程函數返回的線程後加入。我正在嘗試構建一個可以接受客戶端併爲每個客戶端創建線程的乘法客戶端服務器。問題是,在第一個客戶端加入並創建它的線程並調用join之後,listen線程掛起,直到完成。我能做些什麼來使這個線程運行而不會阻塞調用線程? (在C#中,我只需調用Start(),調用線程照常運行)。的boost ::線程加入的功能塊調用線程

問題2: 一般(IM可能缺少的東西),爲什麼會有人想要一個阻塞線程?那有什麼意義呢?調用常規函數不會更簡單快捷嗎?

如果有人能解釋的我如何實現像在C#中的線程同樣的事情也將是巨大的!

在此先感謝!對不起,我的英語不好。

+2

怎麼樣根本就沒有調用'加入()'的線程上? – nullptr 2013-05-11 16:37:26

回答

4

我能做些什麼,使這個線程運行,而不會阻塞調用線程

您可以創建線程,然後就可以調用detach(),使thread對象的析構函數中贏得」如果線程尚未終止,則拋出異常。我會誠實地建議在採用這種「即燃即用」設計之前三思。在C++ 11,您可能需要調用std::async來代替(在這種情況下,你可能想看看this Q&A,其中一個解決辦法,提出了該功能的當前缺點)。

一般來說(我可能錯過了一些東西),爲什麼有人想要一個阻塞線程?那有什麼意義呢?調用常規函數不會更簡單快捷嗎?

那麼,如果你的程序完全不需要等待任務完成,那麼是的 - 我會說,只是使用同步調用。但是,您的程序可能需要並行執行某些操作,並且一旦完成,可能需要等待異步計算的結束才能繼續。在這種情況下,它需要與線程連接。

+0

謝謝你的回答!我現在明白爲什麼有人需要調用加入。 – UnTraDe 2013-05-11 16:42:50

+0

@UnTraDe:不客氣。另外考慮一下,C++ 11有一大堆用於多線程的新原語,比如'std :: future','std :: packaged_task','std :: async()'等等,你可能想要看一下。 – 2013-05-11 16:43:52

+1

@Andy Prowl謝謝你幫我阻止我的頭靠在牆上,這已經持續了一天! – TWhite 2014-08-07 21:23:15

3
  1. 不要調用join()方法。只有當你想要確保線程已經完成執行時(例如,當你銷燬擁有線程的連接管理器類,你想確保線程已經完成執行時),你才加入線程。
  2. 請參閱回答何時調用join()。
+0

感謝您的回答!我沒有解決我的問題,我不知道該構造函數後自動啓動的線程。 – UnTraDe 2013-05-11 16:44:06