[英]Redirecting standard output - Switched from VS2013 to VS2017, exception on writing
[英]From VS2013 to VS2017 std::async does not start a new thread
我将Visual Studio从2013年更新为2017年。编译正常,但似乎std :: async调用未打开新线程。 (调试时,我无法在线程窗口中看到一个新线程。而且看起来像调用async函数的线程可以完成工作...)
那就是我的函数调用:
std::async(std::launch::async, myfunction, this);
我没有更改代码,在VS2013中一切正常。
任何想法? Google不能告诉我很多有关此的信息,但是也许我输入了错误的关键字。 因此关键字也有帮助!
谢谢
您需要坚持async
返回的std::future
,否则临时对象的析构函数将阻塞,直到工作完成。
auto t = std::async(std::launch::async, myfunction, this);
在VS2013中, std::async
不遵守C ++标准。
意见分歧,开发MSVC的开发人员希望std::async
的std::future
的行为与其他std::future
。
该标准不同意。
他们在2013年发布了不符合std::future
。在2015年,如果我没记错的话,他们开始遵循该标准。
该标准指出,拥有std::async( std::launch::async
生成的共享状态)的std::future
的析构函数将阻塞,直到任务完成。
这是因为在实践中,悬挂线程对于以可预测方式运行的程序不利。
您现在负责拥有和坚持future
回报
auto f = std::async(std::launch::async, myfunction, this);
当需要准备就绪时,请f.wait
或f.get
它。
这可能需要更改代码的工作方式。 例如,保持周围期货的矢量(如果你有一个以上的),或添加std::future<?>
成员this
并将其存储(这也保证了异步调用不会活得比对象一生! )。
第二点,Windows上的std::async
也使用有界线程池。 如果有多个async
任务处于活动状态,则可能不会启动新任务。
他们有修复它的计划(因为它违背了标准中的建议),但是在这一点上,我仍然建议使用std::thread
,如果需要std::async
类的行为,请自己实现类似的功能。
我的个人趋势是创建特定于问题的thread_pool
,该std::thread
拥有一定数量的std::thread
,但是让您将任务排队并从中获取future
s(具有给我扩展功能的自定义扩展名,它们的延续能力非常有限)。
这使线程所有权和依赖关系更加明确,并避免了处理仍然存在的MSVC非标准兼容怪癖。
看起来std :: async正在等待返回结尾。 因此,如果您称呼它,则不会异步工作。
std::async(std::launch::async, myfunction, this);
关键是定义答案:myfunction必须返回std :: future,并且您需要定义和相同类型的响应。
std::future<int> foo = std::async(std::launch::async, myfunction, this);
如果在构造函数内部调用std :: async,则foo必须是该类的成员。
class MyClass {
//Your code
private:
std::future<int> exitThread;
}
而且,当您调用std :: async必须
exitThread = std::async(std::launch::async, myfunction, this);
很简单的解决方案:
std::thread t(myfunction, this);
t.detach();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.