@pixik

Как в программе дождаться выполнения всех потоков std::thread перед выходом из функции?

Доброго времени!
У меня есть 2 объекта в основе которых, путем композиции, инкапсулирован std::thread.
В программе нужно запустить оба потока и ждать, пока они не завершатся. Когда я выполняю:
somethread t1, t2;
t1.start();
t2.start();
t1.join();
t2.join();
// some work
exit();

то привязывается к основному потоку только t1, а t2 сам по себе.

В книге Уильямса "Параллельное программированиие на c++", читал про thread_guard, что то вроде защиты потока, где в деструкторе выполняется join() к охраняемому потоку и ждет, пока поток не завершится. Но возможно есть какие то штатные std::* средства, которые позволяют это делать.
  • Вопрос задан
  • 1507 просмотров
Решения вопроса 1
Olej
@Olej
инженер, программист, преподаватель
то привязывается к основному потоку только t1, а t2 сам по себе.

Вообще непонятно что эта фраза могла бы означать?
Никто ни к кому не "привязывается", а pthraed_join() (над чем надстроены все ваши std::thread или boost::thread) - всего лишь ожидает завершения присоединённого (созданного в состоянии PTHREAD_CREATE_JOINABLE) потока.

У вас просто в архитектуре гипотетического приложения - ошибка, а в голове - путаница (относительно потоков).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@iv_k
вариант с бустом
вам не так примерно надо?

boost::thread_group g;
g.create_thread(boost::bind(&t1));
g.create_thread(boost::bind(&t2));
// плодите потоков сколько хочется, можно в цикле
g.join_all();
// ждем пока все завершатся
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы