Всем привет. Помогите понять, как boost::thread можно организовать цикл.
То есть, вот так не работает
for(int i = 0; i < n; ++i)
boost::thread t(&class::func, instance, ...);А если цикл организовать в функции, например
void func()
{
for(int i = 0; i < n; ++i)
{
....
}
}и потом создать поток, то работает.
__sergey
> То есть, вот так не работает
Так это ты треды в цикле создаёшь. И разумеется сразу убиваешь (по выходу итерации).
А зачем вообще буст?
Der FlugSimulator
Так так и надо, поток нужен, чтобы выполнить функцию и все.
Разобрался я уже, надо делать так
for(int i = 0; i < n; ++i)
{
boost::thread t(&class::func, instance, ...);
t.join();
}
> А зачем вообще буст?
А какие еще варианты? winapi использовать?
__sergey
> Разобрался я уже, надо делать так
А я нет, ты слабо объяснил. Но как хочешь.
> А какие еще варианты
std::thread
__sergey
А что ты пытаешься сделать?
Просто эти функции не будут выполнены параллельно. Ты же join зовешь, оно будет ждать.
Funtik
В моем случае это нормально. В основном потоке ничего и не должно происходить, пока то, что надо не посчитается. Там в функции большая работа, поэтому создание потока не должно быть большим оверхедом. У меня функция не считает какие-то новые данные при каждой итерации, а апгрейдит одни и те же переменные в классе, поэтому потоки считают одни и те же переменные, но серийно и без завершения предыдущей итерации это не работает. Поэтому и надо потоки завершать каждый раз. Такие итерации будут для нескольких экземпляров класса, поэтому и надо в параллель, но для каждого отдельного экземпляра апгрейд будет последовательный.
Der FlugSimulator
У меня старая версия, VS2010, там еще нет std::thread. Но семантика у буста точно такая же, как у std в этом случае, наверняка, и под капотом все так же работает. Так-то я тоже использую std. Тут просто необходимость возникла.
__sergey
> Там в функции большая работа
Чел, твои функции выполняются синхронно, смысл других потоков теряется
Как-то так.
for(int i = 0; i < n; ++i)
{
boost::thread t1(&class::func, instance1, ...);
boost::thread t2(&class::func, instance2, ...);
.....
boost::thread tk(&class::func, instancek, ...);
t1.join();
t2.join();
.....
}
__sergey
> Но семантика у буста точно такая же, как у std
Ну оно в std из буста и перетекает какбы, по мере появления новых стандартов
__sergey
Это вариант фунтика, просто ты развернул цикл 🤫
nop90h
Нет, это не цикл развернут, а разные экземпляры в цикле
__sergey
> Нет, это не цикл развернут, а разные экземпляры в цикле
чел, вот код фунтика, здесь по твоему не разные экземпляры?
std::vector<boost::thread> threads;
// Создаем потоки
for (int i = 0; i < n; ++i) {
threads.push_back(boost::thread(&сlass::func, &instance, ...));
}
// Дожидаемся завершения всех потоков
for (auto& t : threads) {
t.join();
}
Рановато ты потоками заинтересовался, имхо.
nop90h
Я не про экземпляры буста, я про свои экземпляры говорю. Несколько экземпляров класса в параллель.
boost::thread t1(&class::func, instance1, ...);
boost::thread t2(&class::func, instance2, ...);
.....
boost::thread tk(&class::func, instancek, ...);
__sergey
> boost::thread t1(&class::func, instance1, ...);
> boost::thread t2(&class::func, instance2, ...);
> .....
> boost::thread tk(&class::func, instancek, ...);
instance[ i ], не?
for(int i = 0; i < n; ++i) { boost::thread t1( &class::func, instance1, ...); boost::thread t2( &class::func, instance2, ...); ..... boost::thread tk( &class::func, instancek, ...); t1.join( ); t2.join( ); ..... }
вообще это похоже на кривой thread pool
Тема в архиве.