Mik*_*ola 6 c++ asynchronous c++11
我有以下非常简单的代码:
void TestSleep()
{
std::cout << "TestSleep " << std::endl;
sleep(10);
std::cout << "TestSleep Ok" << std::endl;
}
void TestAsync()
{
std::cout << "TestAsync" << std::endl;
std::async(std::launch::async, TestSleep);
std::cout << "TestAsync ok!!!" << std::endl;
}
int main()
{
TestAsync();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因为我使用std::launch::async我希望TestSleep()它将异步运行,我将有以下输出:
TestAsync
TestAsync ok!!!
TestSleep
TestSleep Ok
Run Code Online (Sandbox Code Playgroud)
但实际上我有同步运行的输出:
TestAsync
TestSleep
TestSleep Ok
TestAsync ok!!!
Run Code Online (Sandbox Code Playgroud)
你能解释为什么以及如何TestSleep真正地异步拨打电话.
如果
std::future获取的fromstd::async不是从引用移动或绑定到引用,则std::futurewill 的析构函数将在完整表达式结束时阻塞,直到异步操作完成,从而基本上使代码...同步
这就是这里发生的事情.由于您不存储std::async返回的未来,它将在表达式的末尾(即std::async调用)被破坏,并且将一直阻塞直到线程完成.
如果你这样做
auto f = std::async(...);
Run Code Online (Sandbox Code Playgroud)
然后破坏将f在TestAsync阻止,并且文本"TestAsync ok!!!"应该打印之前"TestSleep Ok".
std::async()返回一个实例std::future.如果你查看std::future析构函数的文档,它会说如下:
这些操作不会阻止共享状态准备就绪,除非它可能阻塞以下所有条件都是真的:共享状态是通过调用std :: async创建的,共享状态尚未准备就绪,这个是共享状态的最后一个引用.
您没有将返回值存储std::async()到局部变量中,但仍然创建该值并且必须销毁该值.由于析构函数将阻塞直到函数返回,这使它同步.
如果更改TestAsync()为返回std::future()创建者std::async(),那么它应该是异步的.
| 归档时间: |
|
| 查看次数: |
1368 次 |
| 最近记录: |