c ++ pthread ограничение количества потоков

Я пытался использовать pthread, чтобы выполнить какую-то задачу быстрее. У меня есть тысячи файлов (в аргументах) для обработки, и я хочу создать небольшое количество потоков много раз.
Вот мой код:

void callThread(){
int nbt = 0;
pthread_t *vp = (pthread_t*)malloc(sizeof(pthread_t)*NBTHREAD);
for(int i=0;i<args.size();i+=NBTHREAD){
for(int j=0;j<NBTHREAD;j++){
if(i+j<args.size()){
pthread_create(&vp[j],NULL,calcul,&args[i+j]);
nbt++;
}
}
for(int k=0;k<nbt;k++){
if(pthread_join(vp[k], NULL)){
cout<<"ERROR pthread_join()"<<endl;
}
}
}
}

Это возвращает ошибку, я не знаю, если это хороший способ решить мою проблему. Все ресурсы находятся в аргументах (вектор структуры) и являются независимыми.
Спасибо за помощь.

1

Решение

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

Несколько советов, которые не упомянуты в этом посте:

  • использование std::thread::hardware_concurrency() чтобы получить количество ядер.
  • Выясните способ хранения задач, подсказка: std::packaged_task или что-то вместе
    эти строки обернуты в классе, чтобы вы могли отслеживать такие вещи, как, когда задача выполнена, или реализовать task.join(),
  • Кроме того, GitHub с кодом его реализации плюс некоторые дополнительные вещи, такие как std::future поддержка может быть найдена Вот.
3

Другие решения

Вы можете использовать семафор, чтобы ограничить количество параллельных потоков, вот псевдокод:

Semaphore S = MAX_THREADS_AT_A_TIME  //  Initial semaphore value
declare handle_array[NUM_ITERS];

for(i=0 to NUM_ITERS)
{
wait-while(S<=0);
Acquire-Semaphore;  //  S--

handle_array[i] = Run-Thread(MyThread);

}

for(i=0 to NUM_ITERS)
{
Join_thread(handle_array[i])
Close_handle(handle_array[i])
}MyThread()
{
mutex.lock

critical-section

mutex.unlock

release-semaphore // S++
}
2

По вопросам рекламы [email protected]