2016-12-29 8 views
2

У меня есть программа на C, которая принимает произвольное количество файлов в качестве аргумента командной строки и вычисляет sha1sum для каждого файла. Я использую pthreads, так что я могу использовать все 4 ядра.c pthreads: запускать не более 4 потоков одновременно в любое время

В настоящее время мой код одновременно запускает все потоки параллельно. Вот отрывок:

c = 0; 
for (n = optind; n < argc; n++) { 
    if (pthread_create(&t[c], NULL, &sha1sum, (void *) argv[n])) { 
     fprintf(stderr, "Error creating thread\n"); 
     return 1; 
    } 
    c++; 
} 

c = 0; 
for (n = optind; n < argc; n++) { 
    pthread_join(t[c], NULL); 
    c++; 
} 

Очевидно, что это не является эффективным (или масштабируемый), чтобы начать все темы сразу.

Что было бы лучшим способом убедиться, что в данный момент работает только 4 потока? Как-то мне нужно запустить 4 потока в начале, а затем «заменить» поток новым, как только он будет завершен.

Как я могу это сделать?

ответ

2

Очевидно, что он неэффективен (или масштабируется) для запуска всех потоков одновременно.

Создание 4 потоков не обязательно обеспечивает наилучшую производительность на 4-ядерном компьютере. Если потоки выполняют IO или что-то ждут, создание более 4 потоков может также привести к повышению производительности/эффективности. Вам просто нужно выяснить приблизительное число, основанное на работе ваших потоков и, возможно, мини-эталоном.

Независимо от того, какой номер вы выбрали (то есть количество потоков), то, что вы ищете, это thread pool. Идея состоит в том, чтобы создать фиксированное количество потоков и подать их на работу, как только они завершатся.

См. C: What's the way to make a poolthread with pthreads? для простого скелета. Этот repo также показывает самодостаточный пример (проверьте лицензию, если вы собираетесь ее использовать). Вы можете найти много подобных примеров в Интернете.

0

Вещь, которую вы ищете, это semaphore; он позволит вам ограничить только 4 потока, которые будут работать одновременно. Сначала вы/могли бы начать их все, и он позаботится о том, чтобы новый был запущен, когда закончилась работающая.