在主函数以外的函数中使用 std::async 时的作用域块

scope block when use std::async in function other than the main function

我在使用 st::async 时遇到了一些问题,当我在 Main 函数以外的其他函数中使用它时, 假设,我有流动的功能:

void printData() 
{
   for (size_t i = 0; i < 5; i++)
    {
        std::cout << "Test Function" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

void runningAsync()
{
    auto r = std::async(std::launch::async, test);
}

int main()
{
    runningAsync();

    std::cout << "Main Function" << std::endl;
}

这段代码的输出是:

Test Function
Test Function
Test Function
Test Function
Test Function
Main Function

不好,主线程等待其他线程结束。

我想在其他线程中使用 运行ningAsync() 函数 运行,同时在主线程中使用 "Main Function" 在屏幕上打印,这可以通过 std::thread .

这个 运行 是同时运行(并发)的方式吗?

原因是 std::async returns 您存储在 auto 变量中的 std::future。一旦您的 future 超出范围(在 runningAsync()! 末尾),它的析构函数就会阻塞,直到任务完成。如果你不想这样,你可以将未来存储在一个全局容器中。

此问题已在 :

中回答

main thread waits for std::async to complete

Can I use std::async without waiting for the future limitation?

谁,如果你存储 std::future 对象,它的生命周期将延长到 main 的末尾,你会得到你想要的行为。

void printData() 
{
   for (size_t i = 0; i < 5; i++)
    {
        std::cout << "Test Function" << std::endl;
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

std::future<void> runningAsync()
{
    return std::async(std::launch::async, test);
}

int main()
{
    auto a = runningAsync();

    std::cout << "Main Function" << std::endl;
}

这是个问题,因为 std::future's destructor 可能会阻塞并等待线程完成。查看此 link 了解更多详情