Проблема с реализацией конвейера - PullRequest
5 голосов
/ 07 июня 2011

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

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

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

#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(&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 () они завершаются. Таким образом, состояние программы в начале внешнего цикла в основной программе всегда должно быть одинаковым ...

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

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

Спасибо! Constantin

Ответы [ 2 ]

1 голос
/ 08 июня 2011

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

0 голосов
/ 07 июня 2011

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

...