我使用boost::thread join
方法等待線程完成。但是,如果我嘗試join
線程,當它已經完成我收到一個異常。所以我怎麼能:如何連接線程如果可以連接則不做任何事情?
加入線程,如果活動,如果不活躍,什麼都不做?
我使用boost::thread join
方法等待線程完成。但是,如果我嘗試join
線程,當它已經完成我收到一個異常。所以我怎麼能:如何連接線程如果可以連接則不做任何事情?
加入線程,如果活動,如果不活躍,什麼都不做?
使用joinable()
函數來檢查它是否應該被加入:
if (thread.joinable()) thread.join();
可以(事實上,你必須)加入一個線程,即使它已經結束,除非它已經分離。加入它兩次或者加入一個空的或分離的線程是一個錯誤。
謝謝!我假設'如果(thread.joinable())thread.join();'不是原子操作,所以......非常不可能但仍然可能會收到異常? – javapowered
@javapowered:不,應該沒有例外,除非你加入兩次。不管你調用'join'的時候另一個線程是否完成 - 無論如何它都需要被連接。 (當然,如果兩個線程都試圖以這種方式加入它,你將會有一場競賽;但這將是一個瘋狂的設計)。 –
使其明確:如果線程尚未加入並且尚未分離,則'joinable()'返回true。這些都是全球性的行爲,不應該在可能進行比賽的情況下完成。 –
此主題可能會有幫助:http://stackoverflow.com/questions/1667420/how-can-i-tell-reliably-if-a-boost-thread-has-exited-its-run-method – taocp
是你確定沒有其他事情了嗎?在手冊中它說'如果boost :: thread對象表示的執行線程已經完成,或者boost :: thread對象表示Not-a-Thread,那麼join()立即返回。「 –