簡體   English   中英

std :: thread不是全局變量,但是到達創建它的函數的末尾時不會超出范圍嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM