簡體   English   中英

在不同的線程中停止無限循環

[英]Stop infinite loop in different thread

在我的應用程序中,我使用多個線程執行一些耗時的任務,這是為了在應用程序的整個持續時間內運行。 我想要實現的是一些漂亮而干凈的方法在退出app之前殺死第二個線程中的循環,所以我可以在循環后清理然后關閉所有內容。

到目前為止,我已經提出了這種方法,但說實話,我並不是它的忠實粉絲:

#include <iostream>
#include <thread>

bool stop_flag;

void foo()
{
    while(!stop_flag)
    {
        //do something
    }
    clean_after();
}

int main()
{
    stop_flag = false;
    std::thread whileThread(foo);

    // app lifetime

    stop_flag = true;   
    whileThread.join();
    return 0;
}

只需略微更改,您的代碼就可以了:

std::atomic<bool> stop_flag;

從多個線程讀取和寫入相同的非同步變量無論如何都是未定義的行為。 風扇與否,編譯器可能只是優化檢查,循環可能永遠不會啟動或永遠不會結束。

如前所述,您可以使用std::atomic_bool 我不是全球范圍內的粉絲 - 將它作為“取消令牌”傳遞給foo

void foo(std::atomic_bool& cancellation_token)
{
    while(!cancellationToken)
    {
        //do something
    }
    clean_after();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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