У меня есть многопоточное приложение с циклом, ожидающим ввода пользователя в качестве основного потока. При правильном вводе предполагается остановить цикл и дождаться, пока все другие потоки закончатся должным образом.
Для этого я создал std :: list, в который я поместил объекты std :: future, созданные для создания потока.
std::list<std::future<int>> threads;
threads.emplace_front(std::async(std::launch::async, ...));
У меня создалось впечатление, что, если позволить list выйти за пределы области видимости, он должен заблокироваться, пока все потоки не вернут свою основную функцию, потому что деструктор list уничтожит все std :: future элементов и их деструктор будет ждать, пока нить закончить.
РЕДАКТИРОВАТЬ: Поскольку это актуально, я добавлю его сюда: это на Win7 с версией MSVC в Visual Studio 2013 Professional / EDIT
Когда я попробовал это, не заблокировалось, пришлось добавить
for (auto it = threads.begin(); it != threads.end(); ++it) {
it->get();
}
до конца функции, чтобы правильно заблокировать.
Я что-то неправильно понял, или мне нужно создать ветку по-другому, чтобы делать то, что я хочу здесь делать?
std::async
требует его блокировки. Интересно... - person T.C.   schedule 06.09.2014