簡體   English   中英

計時器掛起主線程

[英]Timer hangs main thread

我正在嘗試用標准環境實現計時器這是我的代碼:

bool shutdownDetected = false;

void signal_handler(const int sigid)
{
    shutdownDetected = true;
}

int main(int argc, const char * argv[])
{
    signal(SIGTERM, (sig_t)signal_handler);

    std::async(std::launch::async, [&] () {
        std::this_thread::sleep_for( std::chrono::milliseconds{5000});
        std::cout << "On TIMER!" << std::endl;
    } );

    std::cout << "main function" << std::endl;

    while (!shutdownDetected) {
    }

    return EXIT_SUCCESS;
}

結果我在5秒后在輸出中看到:

// 5 seconds left
On Timer
main function

但是想看看:

main function
// 5 seconds left
On Timer

似乎我的實現也掛起了主線程。 怎么避免這個?

你的std :: async命令返回一個std :: future,然后立即銷毀。 問題在於未來的破壞涉及“加入”您創建的線程,這意味着析構函數將等到線程自行結束並且主線程中的代碼執行在該過程完成之前不會前進。

簡單的答案是將std :: async調用的結果賦給變量,並可能在測試終止的循環中調用其get()成員函數。

auto t = std::async(std::launch::async, [&] () {
    std::this_thread::sleep_for( std::chrono::milliseconds{5000});
    std::cout << "On TIMER!" << std::endl;
} );

std::cout << "main function" << std::endl;

t.get();
std::async(std::launch::async, [&] () {
        std::this_thread::sleep_for( std::chrono::milliseconds{5000});
        std::cout << "On TIMER!" << std::endl;
    } );

除非您將std::async返回的std::future分配給變量並保留它,否則不起作用。 我不知道為什么會這樣,顯然是因為我不敢去查閱它。 Vincent Savard做了,並將我們鏈接到std::future析構函數文檔,其中說:

如果滿足以下所有條件,它可能會阻塞:共享狀態是通過調用std :: async創建的,共享狀態尚未就緒,這是對共享狀態的最后一次引用。

由於返回的std::future未分配給任何東西,它會立即被銷毀,析構函數會阻塞直到完成。

我將省略信號處理程序,因為它與問題無關。

#include <iostream>
#include <future>

int main()
{
    auto letMeLive = std::async(std::launch::async, [] () {
        std::this_thread::sleep_for( std::chrono::milliseconds{5000});
        std::cout << "On TIMER!" << std::endl;
    } );

    std::cout << "main function" << std::endl;

    letMeLive.wait(); // instead of the signal handler
    return EXIT_SUCCESS;
}

暫無
暫無

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

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