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



我在 Main 函数以外的其他函数中使用它时对 st::async 有一些问题,假设,我有像 flow 这样的函数:

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

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

我希望 runningAsync() 函数在其他线程中运行,同时在 screan 上的主线程打印中运行"Main Function",这可以通过 std::thread 实现。

这是这样同时运行此功能(并发)吗?

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

这个问题在 回答:

主线程等待 std::async 完成

我可以在不等待未来限制的情况下使用 std::async 吗?

无论是谁,如果你存储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 的析构函数可能会阻塞并等待线程完成。 有关更多详细信息,请参阅此链接

最新更新