Ong*_*ngy 11 c++ multithreading stdlist c++11
我有一个多线程应用程序,循环等待用户输入作为主线程.在正确的输入上,它应该停止循环并等待所有其他线程,以正确结束.
为此我创建了一个std :: list,在其中我为创建线程创建了std :: future对象
std::list<std::future<int>> threads;
threads.emplace_front(std::async(std::launch::async, ...));
Run Code Online (Sandbox Code Playgroud)
我的印象是,让列表超出范围,应该阻塞,直到所有线程都返回它们的主函数,因为列表的析构函数将会破坏所有std :: future元素,并且那些析构函数将等待,因为该线程完成.
编辑:因为它是相关的,我将在这里添加:这是在Win7上使用Visual Studio 2013 Professional / EDIT中的MSVC版本
当我尝试这个时,它没有阻止,我不得不补充
for (auto it = threads.begin(); it != threads.end(); ++it) {
it->get();
}
Run Code Online (Sandbox Code Playgroud)
到函数结束,要正确阻止.
我是否错过了解某些内容,或者我是否必须以不同的方式创建该主题,以执行我想要执行的操作?
T.C*_*.C. 13
这是MSVC的bug已被修正,但直到MS发布的Visual C++,在2015年可能是一些时间(这也是新版本的修复将无法提供可供选择CTP的新版本,但它是一个非常不好的想法,用于任何生产代码......)
正如斯科特迈尔斯在解释他的博客,的析构函数std::future
通过返回的std::async
使用呼叫launch::async
策略将阻塞,直到产生的线程执行完毕(§30.6.8[futures.async]/P5)要求:
如果实施选择了
launch::async
政策,
- [...]
- 相关线程完成与同步(1.10)在从成功地检测到共享状态或从最后一个函数释放共享状态,先发生者为准返回就绪状态的第一个函数返回.
在这种情况下,future
的析构函数,所以线程必须完成的'释放的共享状态的最后一个函数’ 与同步(即之前发生)是函数的返回.
归档时间: |
|
查看次数: |
1478 次 |
最近记录: |