2016-10-10 49 views
0

我有這樣一個線程:的std ::螺紋,要完成的功能

std::thread t{ [](){} }; 

因此,新線程完成突然。如果我沒有撥打join,操作系統是否有可能將上下文切換到這個「死」線程?或者系統「注意到」這個線程沒有激活,並且從來沒有切換到它,即使我從未打電話給join

+0

你有什麼用途呢? –

+0

你必須調用'join'或'detach'。不這樣做,C++運行庫會終止你的程序。 – ks1322

回答

1

當你的線程完成它真的完成。操作系統將永遠不會切換上下文,因爲無處可切換上下文。但是你的std :: thread對象仍然存在,你仍然可以調用join。它會表現得很好:一旦線程結束,立即返回。

0

操作系統可能切換到您的線程的確切算法不是由C++定義的,而是由您的操作系統調度程序定義的。

根據標準§30.3,如果t.joinable()爲true,那麼可能存在與您的線程對象相對應的操作系統線程。請注意,即使線程運行完成,只要線程尚未連接或分離,t.joinable()也是如此。

如果你已經分離了,那麼這個對象就不再連接到底層的OS線程實現上了,這通常是操作系統清理的責任(例如,在程序終止時),除非你做了一些與平臺相關的工作本地句柄明確。分離後,該線程的代碼可能仍在運行。