The*_*ife 2 c++ multithreading asynchronous c++11
我从2013年到2017年更新了我的Visual Studio.编译很好但似乎std :: async调用没有打开新线程.(在调试时我无法在线程窗口中看到一个新的.也看起来调用异步函数的线程完成了这项工作......)
那是我的函数调用:
std::async(std::launch::async, myfunction, this);
Run Code Online (Sandbox Code Playgroud)
我没有在我的代码中更改任何内容,在VS2013中,一切正常.
任何的想法?谷歌不能告诉我很多关于这一点,但也许我有错误的关键字.所以关键字也会有所帮助!
谢谢
你需要保持std::future返回,async否则临时的析构函数将阻塞,直到工作完成.
auto t = std::async(std::launch::async, myfunction, this);
Run Code Online (Sandbox Code Playgroud)
在VS2013中,std::async不遵守C++标准.
有分歧,并在MSVC工作的开发者希望std::async的std::future表现像其他std::future.
标准不同意.
他们std::future在2013年发布了非标准合规.2015年如果我没记错,他们就开始遵循标准了.
该标准规定std::future拥有共享状态的析构函数由std::async( std::launch::async块生成,直到任务完成.
这是因为,在实践中,悬挂线程对于以可预测的方式表现的程序是不利的.
你现在负责拥有和坚持future归来的
auto f = std::async(std::launch::async, myfunction, this);
Run Code Online (Sandbox Code Playgroud)
当你需要它准备好时,f.wait或者f.get它.
这可能需要更改代码的工作方式; 例如,保持期货的向量(如果你有多个),或者添加一个std::future<?>成员this并存储它(这也可以确保异步调用不会超过对象的生命周期!).
作为第二个注释,std::async在Windows上也使用有界线程池; 如果async活动的任务数超过一定数量,则可能无法启动新任务.
他们有计划修复它(因为它违反了标准中的建议),但此时我仍然建议使用std::thread,如果你需要std::async像自己那样实现类似的行为.
我个人的倾向是创建thread_pool具有特定数量的std::threads 的特定于问题的s,但是让你对任务进行排队并从中获取futures(使用自定义扩展,这使我具有非常有限的延续能力).
这使得线程所有权和依赖关系更加明确,并避免处理仍然存在的MSVC非标准兼容怪癖.