[英]std::thread that isn't a global variable but doesn't go out of scope when the end of the function that created it is reached?
因此,我遇到了一些似乎無法達到std::thread
目的的東西,或者至少使它變得不太方便。
假設我想生成一個std::thread
來執行一次任務,然后又不想再擔心它。 我在函數末尾附近創建了這個thread
,因此在我看來, std::thread
很快就會超出范圍,可能是在thread
仍在運行時。 這會帶來一些解決方案的問題(或者至少是我所知道的)。
我可以:
A)將std::thread
為全局變量,這樣它就不會超出范圍。
B)在std::thread
上調用join()
,這違背了生成線程的目的。
還有其他更好的方法來處理這種情況嗎?
您想要的是std :: thread :: detach 。
它使實際的執行線程與std::thread
對象解耦,使您可以在不加入線程的情況下銷毀它。
您可以使用std::async
。
async異步運行函數f(可能在單獨的線程中,該線程可能是線程池的一部分),並返回std :: future,最終將保留該函數調用的結果。
由於您沒有提到需要獲取線程的結果,因此無需獲取未來。
如評論中所指出的,在任何情況下,std :: future的析構函數都將被阻止,因此您必須將其移至某個全局對象(並手動管理未使用的期貨的刪除),或者可以將其移至本地范圍異步調用的函數。
另一個首選選項是允許線程使用任務隊列中的任務。 為此,將作業拆分為多個任務塊並饋入工作線程。 為避免輪詢,請選擇condition_variable。
std::thread([&](){
while(running) // thread loop
{
// consume tasks from queue
}
}).detach();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.