#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
объекты в группе, так что это не будет проблемой.