ПрограммированиеФорумОбщее

boost::thread

Страницы: 1 2 3 4 5 Следующая »
#0
11:32, 16 фев 2025

Всем привет. Помогите понять, как boost::thread можно организовать цикл.
То есть, вот так не работает

    for(int i = 0; i < n; ++i)
         boost::thread t(&class::func, instance, ...);

А если цикл организовать в функции, например

    void func()
    {
        for(int i = 0; i < n; ++i)
        {
             ....
        }
    }

и потом создать поток, то работает.

#1
17:01, 16 фев 2025

__sergey
> То есть, вот так не работает
Так это ты треды в цикле создаёшь. И разумеется сразу убиваешь (по выходу итерации).

А зачем вообще буст?

#2
17:20, 16 фев 2025

Der FlugSimulator
Так так и надо, поток нужен, чтобы выполнить функцию и все.
Разобрался я уже, надо делать так

    for(int i = 0; i < n; ++i)
  {
        boost::thread t(&class::func, instance, ...);
        t.join();
    }

> А зачем вообще буст?
А какие еще варианты? winapi использовать?

#3
18:07, 16 фев 2025

__sergey
> Разобрался я уже, надо делать так
А я нет, ты слабо объяснил. Но как хочешь.

> А какие еще варианты

std::thread

#4
18:34, 16 фев 2025

__sergey
А что ты пытаешься сделать?
Просто эти функции не будут выполнены параллельно. Ты же join зовешь, оно будет ждать.

#5
18:58, 16 фев 2025

Funtik
В моем случае это нормально. В основном потоке ничего и не должно происходить, пока то, что надо не посчитается. Там в функции большая работа, поэтому создание потока не должно быть большим оверхедом. У меня функция не считает какие-то новые данные при каждой итерации, а апгрейдит одни и те же переменные в классе, поэтому потоки считают одни и те же переменные, но серийно и без завершения предыдущей итерации это не работает. Поэтому и надо потоки завершать каждый раз. Такие итерации будут для нескольких экземпляров класса, поэтому и надо в параллель, но для каждого отдельного экземпляра апгрейд будет последовательный.

#6
19:08, 16 фев 2025

Der FlugSimulator
У меня старая версия, VS2010, там еще нет std::thread. Но семантика у буста точно такая же, как у std в этом случае, наверняка, и под капотом все так же работает. Так-то я тоже использую std. Тут просто необходимость возникла.

#7
19:23, 16 фев 2025

__sergey
> Там в функции большая работа
Чел, твои функции выполняются синхронно, смысл других потоков теряется

#8
19:33, 16 фев 2025

  Как-то так.

  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();
        .....
    }

#9
19:33, 16 фев 2025

__sergey
> Но семантика у буста точно такая же, как у std
Ну оно в std из буста и перетекает какбы, по мере появления новых стандартов

#10
19:35, 16 фев 2025

__sergey
Это вариант фунтика, просто ты развернул цикл 🤫

#11
19:54, 16 фев 2025

nop90h
Нет, это не цикл развернут, а разные экземпляры в цикле

#12
20:08, 16 фев 2025

__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();
}

Рановато ты потоками заинтересовался, имхо.

#13
20:17, 16 фев 2025

nop90h
Я не про экземпляры буста, я про свои экземпляры говорю. Несколько экземпляров класса в параллель.

        boost::thread t1(&class::func, instance1, ...);
        boost::thread t2(&class::func, instance2, ...);
        .....       
        boost::thread tk(&class::func, instancek, ...);

#14
20:26, 16 фев 2025

__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

Страницы: 1 2 3 4 5 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.