c++ std::async的注意事项
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ std::async的注意事项相关的知识,希望对你有一定的参考价值。
1、没有返回
考虑下面这个耗时操作
void foo(int &n)
{
for (int i = 0; i < 5; ++i) {
std::cout << "Thread executing\\n";
++n;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
如果用线程调用,没有问题
int n = 0;
std::thread t1(foo,std::ref(n));
一定是往下走,再打印start 和 end
如果使用async呢,我在其他的文章中有一定的描述,但是有一定的错误在这里,
int main(int argc, char* argv[])
{
int n = 0;
std::async(std::launch::async,foo,ref(n));
cout << "here is here" << endl;
//cout << result.get();
getchar();
return 0;
}
打印结果
Thread executing
Thread executing
Thread executing
Thread executing
Thread executing
here is here
奇怪吧,不是异步吗 ,为什么 here is here 是等到结束才执行?
使用返回
因为没有使用返回,我们修改一下
int main(int argc, char* argv[])
{
int n = 0;
std::future<void> result = std::async(std::launch::async,foo,ref(n));
cout << "here is here" << endl;
//cout << result.get();
getchar();
return 0;
}
here is hereThread executing
Thread executing
Thread executing
Thread executing
Thread executing
可以看到here is here 和 Thread executing 一起粘在了,因为我们没有对输出进行控制,导致两个同时在打印,而且here is here 先于 Thread executing,说明我们的结果对了,执行成异步了。
以上是关于c++ std::async的注意事项的主要内容,如果未能解决你的问题,请参考以下文章
C# Task.Run() 与 C++ std::async()