Проблема с реализацией конвейера

#c #multithreading #boost #pipeline

#c #многопоточность #повышение #конвейер

Вопрос:

Я создал приложение, которое использует шаблон конвейера для выполнения некоторой обработки. Однако я заметил, что когда конвейер запускается несколько раз подряд, он имеет тенденцию становиться все медленнее и медленнее.

Это также тот случай, когда на этапах конвейера не выполняется фактическая обработка — поэтому мне любопытно, может быть, в моей реализации конвейера есть проблема.

Это простая тестовая программа, которая перепрограммирует эффект:

 #include <iostream>
#include <boost/thread.hpp>

class Pipeline {

    void processStage(int i) {

        return;
    }


public:

    void run() {


        boost::thread_group threads;

        for (int i=0; i< 8;   i) {

            threads.add_thread(new boost::thread(amp;Pipeline::processStage, this, i));
        }

        threads.join_all();
    }
};



int main() {


    Pipeline pipeline;

    int n=2000;
    for (int i=0;i<n;   i) {

            pipeline.run();

            if (((i 1)*100)/n > (i*100)/n) 
                std::cout << "r" << ((i 1)*100)/n << " %";
    }

}
  

В моем понимании потоки создаются в run() и в конце run() они завершаются. Таким образом, состояние программы в начале внешнего цикла в основной программе всегда должно быть одинаковым…

Но то, что я наблюдаю, — это возрастающее замедление при обработке этого цикла.

Я знаю, что было бы эффективнее поддерживать потоки конвейера в рабочем состоянии на протяжении всей программы, но мне нужно знать, есть ли проблема с моей реализацией конвейера.

Спасибо! Константин

Комментарии:

1. мне кажется правильным, должен быть какой-то другой побочный эффект

2. Мне кажется, все эти тесты кода показывают, насколько быстро ваша ОС может создавать и уничтожать потоки. Чем это полезно?

3. @ildjam: Этот код не является полезным намеренно — это минимальный код для воспроизведения описанного эффекта.

4. Это количество раз, когда выполняется ваш цикл.. почти как 2000 * 8 раз

Ответ №1:

Я не знаю точной причины замедления run(), но когда я использую код obove и вставляю небольшой режим ожидания (500 мс) в конце цикла в main (), тогда замедление run () исчезает. Таким образом, системе, похоже, требуется некоторое «время восстановления», пока она не сможет создавать новые потоки.

Ответ №2:

Поскольку вы выполняете new boost::thread (), вы пытались их очистить? Если вы работаете в Windows, посмотрите в диспетчере задач количество потоков, открытых процессом, и при необходимости закройте дескрипторы потоков. Я подозреваю, что количество потоков, созданных системой, продолжает увеличиваться..

Комментарии:

1. boost::thread_group Деструктор удалит все thread объекты в группе, так что это не будет проблемой.