int calculate_the_answer_to_LtUaE(){
sleep(5);
cout << "Aaa" << endl;
}
std::future<int> the_answer=std::async(calculate_the_answer_to_LtUaE);
the_answer.get();
cout << "finish calling" << endl;
sleep(10000);
我需要调用the_answer.get()来调用calculate_the_answer_to_LtUaE()并在屏幕上打印Aaa。如果我注释掉了the_answer.get()行,我就不会打印任何内容。这是std :: async函数的预期行为还是我在这里做错了什么?这是因为我认为the_answer.get()用于等待函数完成并检索结果。
感谢。
答案 0 :(得分:5)
如果您阅读了与“发布政策”相关的内容,您会发现我的评论完全正确。你所看到的行为是完全允许的。
您可以使用启动政策强制执行您想要的操作:
std::future<int> the_answer=std::async(std::launch::async,calculate_the_answer_to_LtUaE);
答案 1 :(得分:4)
“std :: async的默认启动策略是std :: launch :: any,这意味着实现可以为您选择。”
您需要std::launch::async
,基本上:
std::future<int> the_answer=std::async(std::launch::async, calculate_the_answer_to_LtUaE);
// ^^^^^^^^^^^^^^^^^^
确保异步调用放在新线程中。否则它可能会推迟调用计算函数直到the_answer.get()
并在当前线程中调用它。