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