2013-04-15 23 views
2

我使用boost::thread join方法等待線程完成。但是,如果我嘗試join線程,當它已經完成我收到一個異常。所以我怎麼能:如何連接線程如果可以連接則不做任何事情?

加入線程,如果活動,如果不活躍,什麼都不做?

+0

此主題可能會有幫助:http://stackoverflow.com/questions/1667420/how-can-i-tell-reliably-if-a-boost-thread-has-exited-its-run-method – taocp

+0

是你確定沒有其他事情了嗎?在手冊中它說'如果boost :: thread對象表示的執行線程已經完成,或者boost :: thread對象表示Not-a-Thread,那麼join()立即返回。「 –

回答

4

使用joinable()函數來檢查它是否應該被加入:

if (thread.joinable()) thread.join(); 

可以(事實上,你必須)加入一個線程,即使它已經結束,除非它已經分離。加入它兩次或者加入一個空的或分離的線程是一個錯誤。

+2

謝謝!我假設'如果(thread.joinable())thread.join();'不是原子操作,所以......非常不可能但仍然可能會收到異常? – javapowered

+0

@javapowered:不,應該沒有例外,除非你加入兩次。不管你調用'join'的時候另一個線程是否完成 - 無論如何它都需要被連接。 (當然,如果兩個線程都試圖以這種方式加入它,你將會有一場競賽;但這將是一個瘋狂的設計)。 –

+1

使其明確:如果線程尚未加入並且尚未分離,則'joinable()'返回true。這些都是全球性的行爲,不應該在可能進行比賽的情況下完成。 –

相關問題