我有一个多线程应用程序,循环等待用户输入作为主线程.在正确的输入上,它应该停止循环并等待所有其他线程,以正确结束.
为此我创建了一个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)
到函数结束,要正确阻止.
我是否错过了解某些内容,或者我是否必须以不同的方式创建该主题,以执行我想要执行的操作?
我有一部分代码,其中一个线程调用如下内容:
cond->notify_all();
delete cond;
Run Code Online (Sandbox Code Playgroud)
和
std::condition_variable_any cond;
Run Code Online (Sandbox Code Playgroud)
Afaik,这应该可行,因为我应该被允许删除条件变量,一旦我通知所有等待它的线程,它们就不必从等待调用中恢复。
在 Windows 上,有时会因错误而崩溃:
mutex destroyed while busy
Run Code Online (Sandbox Code Playgroud)
打印到标准输出
在linux上,使用clang 3.5,这工作得很好,在Windows上,我使用Visual Studio 2013,使用v120 takeit,v120是默认的。
是我做错了什么,是我误解了标准,还是 M$ 在这里做错了什么?如果是这样,我该如何解决这个问题?