我有一个多线程应用程序,有一个循环作为主线程等待用户输入。
在正确的输入上,它应该停止循环并等待所有其他线程正确结束。
为此,我创建了一个 std::list ,其中放置了为创建线程而创建的 std::future 对象
std::list<std::future<int>> threads;
threads.emplace_front(std::async(std::launch::async, ...));
我的印象是,让 list 超出范围,应该阻塞,直到所有线程返回其主函数,因为 list 的析构函数将解构所有 std::future 元素和那些的析构函数 http://en.cppreference.com/w/cpp/thread/future/~future将等待线程完成。
EDIT:由于它是相关的,我将在这里添加它:
这是在Win7上使用Visual Studio 2013 Professional中的MSVC版本/EDIT
当我尝试这个时,它没有阻止,我必须添加
for (auto it = threads.begin(); it != threads.end(); ++it) {
it->get();
}
到函数末尾,以正确阻止。
我是否误解了什么,或者我是否必须以不同的方式创建线程,才能在这里做我想做的事情?
这是一个MSVC 错误已修复 https://connect.microsoft.com/VisualStudio/feedback/details/810623,但要等到 MS 发布新版本的 Visual C++(可能是 2015 年的某个时间)后,此修复程序才会可用。(这也是在新版本的 CTP 中可用 http://blogs.msdn.com/b/vcblog/archive/2014/06/06/c-14-stl-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1.aspx,但将其用于任何生产代码都是一个非常糟糕的主意......)
正如斯科特·迈耶斯 (Scott Meyers) 所解释的那样他的博文 http://scottmeyers.blogspot.com/2013/03/stdfutures-from-stdasync-arent-special.html, a 的析构函数std::future
由返回std::async
呼叫使用launch::async
策略需要阻塞,直到生成的线程完成执行(§30.6.8 [futures.async]/p5):
如果实施选择launch::async
policy,
- [...]
- 关联的线程完成与同步(1.10)
从第一个成功检测到就绪的函数返回
共享状态的状态或从最后一个函数返回的状态
释放共享状态,以先发生者为准。
在这种情况下,future
的析构函数是“释放共享状态的最后一个函数”,因此线程完成必须同步于(即发生在)该函数的返回之前。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)