0

我对 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

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

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

这是同时运行此功能的方式(并发)吗?

4

2 回答 2

3

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

于 2019-01-08T14:19:43.473 回答
1

这个问题回答:

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

于 2019-01-08T14:37:21.310 回答