我有一个多线程应用程序,有一个循环等待用户输入作为主线程。在正确的输入下,应该停止循环并等待所有其他线程正确结束。
为此,我创建了一个std :: list,其中将为线程创建而创建的std :: future对象放入其中
std::list<std::future<int>> threads;
threads.emplace_front(std::async(std::launch::async, ...));
我的印象是,让列表超出范围应该阻塞,直到所有线程返回其主函数为止,因为列表的析构函数将破坏所有std :: future元素,而那些析构函数将等待线程完成。
编辑:因为它是相关的,所以我将在这里添加:这是在Win7上,Visual Studio 2013 Professional / EDIT中的MSVC版本
当我尝试此操作时,它没有阻止,我不得不添加
for (auto it = threads.begin(); it != threads.end(); ++it) {
it->get();
}
到函数末尾,以正确阻止。
我是否有误解,还是必须以其他方式创建线程来执行我在这里想要做的事情?
这是MSVC的bug已被修正,但直到MS发布了Visual C ++的新版本,在2015年可能有一段时间的修复将无法提供(这也是在CTP新版本,但它是一个相当将其用于任何生产代码的好主意...)
正如Scott Meyers在其博客文章中所解释的那样,要求阻塞使用该策略std::future
的std::async
调用返回的析构函数,launch::async
直到生成的线程完成执行为止(第30.6.8节[futures.async] / p5):
如果实施选择
launch::async
政策,
- [...]
- 相关联的线程完成与(1.10)成功检测共享状态的就绪状态的第一个函数的返回值或释放共享状态的最后一个函数的返回值同步(以先发生者为准)。
在这种情况下,future
的析构函数是“释放共享状态的最后一个函数”,因此线程完成必须与该函数的返回同步(即,发生在该函数返回之前)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句