Ограничение количества одновременных исполнений теад в pthreads - PullRequest
0 голосов
/ 12 июля 2011

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

Command1
Command2
Command3
.
.
CommandN

Для каждой команды я хочу создать поток. Теперь проблема в том, что при большом количестве команд я в конечном итоге создаю большое количество потоков, чего я хочу избежать. Итак, я хотел бы ограничить количество потоков, которые выполняются в любой момент времени. Допустим, это число 5.

Может кто-нибудь подсказать, пожалуйста, как этого добиться? Я использую следующий код для обучения-

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 4

void *BusyWork(void *t)
{
   int i;
   long tid;
   double result=0.0;
   tid = (long)t;
   printf("Thread %ld starting...\n",tid);
   for (i=0; i<1000000; i++)
   {
      result = result + sin(i) * tan(i);
   }
   printf("Thread %ld done. Result = %e\n",tid, result);
   pthread_exit((void*) t);
}

int main (int argc, char *argv[])
{
   pthread_t thread[NUM_THREADS];
   pthread_attr_t attr;
   int rc;
   long t;
   void *status;

   /* Initialize and set thread detached attribute */
   pthread_attr_init(&attr);
   pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

   for(t=0; t<NUM_THREADS; t++) {
      printf("Main: creating thread %ld\n", t);
      rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t); 
      if (rc) {
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
         }
      }

   /* Free attribute and wait for the other threads */
   pthread_attr_destroy(&attr);
   for(t=0; t<NUM_THREADS; t++) {
      rc = pthread_join(thread[t], &status);
      if (rc) {
         printf("ERROR; return code from pthread_join() is %d\n", rc);
         exit(-1);
         }
      printf("Main: completed join with thread %ld having a status of %ld\n",t,(long)status);
      }

printf("Main: program completed. Exiting.\n");
pthread_exit(NULL);
}

Есть ли хорошие примеры для модели нитей Boss / Worker?

Ответы [ 3 ]

3 голосов
/ 12 июля 2011

Создайте очередь, куда вы положили новые задания.Создать 5 тем.Каждый поток выберет одно задание и обработает его, а затем выберет следующее.Когда очередь пуста, потоки могут выйти, и вы можете выполнить thread_join.Вам потребуется синхронизация для очереди (или массива).

0 голосов
/ 12 июля 2011

Похоже, что вы ищете, это концепция пула потоков.На странице Википедии есть несколько достойных ссылок на статьи, которые реализуют это.Кроме того, поиск «пулов потоков» на github должен дать вам несколько простых простых реализаций.

0 голосов
/ 12 июля 2011

В main инициализируйте семафор с начальным значением 4. Внутри функции BusyWork каждый поток должен ждать семафора при входе, а затем отправлять после выхода.Как только вы соединили все свои темы, уничтожьте семафор.

РЕДАКТИРОВАТЬ!Забыл ссылку !

...