在主函数以外的函数中使用 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 了解更多详情
我在使用 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 了解更多详情