В вашем примере у вас есть только один активный поток за один раз.Вы запускаете его и ждете, пока он не закончится, прежде чем читать следующую строку из файла.Это вызвано pthread_join, который следует за созданием потока.Вместо этого вам нужно переместить оператор join
за пределы цикла, чтобы объединить все созданные вами потоки.
Теперь вы можете ограничить количество потоков без создания пула.Вам просто нужен атомарный счетчик, который вы увеличивали бы перед началом потока и уменьшали по окончании потока.Таким образом, вы можете проверить значение счетчика перед созданием следующего потока и ожидать условную переменную.Это будет своего рода семафор.
Схематично что-то вроде следующего:
counter = 0;
while {
lock counter;
while (counter > 8)
wait_on_conditional_variable
counter ++;
unlock counter;
run thread;
}
join all remaining threads.
в потоке
do work;
lock counter;
counter --;
signal cond var;
unlock counter;
return;
Для пула вам потребуется запустить несколько потоков.Каждый поток имеет цикл, в котором он ожидает, что какая-то работа будет доступна.Скорее всего, получит его с пятерки.Для проверки требуется условная переменная.
thread
do {
lock fifo;
while (fifo.size == 0)
wait on conditional variable.
read job from fifo;
unlock fifo;
do work;
} while (!exiting);
во время чтения файла необходимо выполнить следующее:
while ... {
lock fifo;
push line into fifo;
signal var;
unlock fifo;
}
set-exit-condition;
join the pools.
Надеюсь, это поможет.Но есть несколько способов и оптимизаций, которые вы могли бы сделать там.