繁体   English   中英

从VS2013到VS2017 std :: async不会启动新线程

[英]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::asyncstd::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.waitf.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM