Как разбудить спящие потоки и выйти из основного потока? - PullRequest
1 голос
/ 05 февраля 2020

Я создаю 10 потоков. Каждый поток выполнит какую-то задачу. Есть 7 задач. Поскольку количество задач меньше количества потоков, всегда будет 3 потока, которые спят и ничего не делают.

Мой основной поток должен дождаться завершения задач и завершиться только после того, как все задачи будут выполнены (т.е. когда поток завершится). Я жду в течение l oop и звоню pthread_join, но с 3 спящими потоками, как я могу разбудить их и заставить их выйти?

Вот что я делаю сейчас.

// thread handler function, called when the thread is created
void* handler_func(void* arg) {
  while(true){
       pthread_mutex_lock(&my_queue_mutex);
           while(my_queue_is_empty()) {
                 pthread_cond_wait(&my_cond_var, &my_queue_mutex);
           }
           item = get_item_from_queue();
       pthread_mutex_unlock(&my_queue_mutex);
   }   
  pthread_exit(NULL);
}

int total_threads_to_create = 10;
int total_requests_to_make = 7;
pthread_t threads[total_threads_to_create];


for(int i = 0; i < total_threads_to_create; i++) {
     // create threads
     pthread_create(&threads[i], NULL, handler_func, NULL);

}

for(int i=0;i<total_requests_to_make;i++){
      // fill up the task queue
      add_task_to_my_queue(i + 100);

}



for(int i = 0; i< total_threads_to_create; i++) {
       // wait for threads to finish
       pthread_join(threads[i], NULL);
}

1 Ответ

2 голосов
/ 05 февраля 2020

Самое простое, что можно сделать, это поставить в очередь фиктивные задания, которые обозначают «все сделано» для рабочих, поскольку вы заранее знаете количество работников:

for(int i=0;i<total_threads_to_create;i++){
  // a task of -1 means "no more work"
  add_task_to_my_queue(-1);
}

В качестве альтернативы вы можете получить « хрупкая »очередь. Эта очередь пробуждает ожидающих потребителей с составным предикатом: либо непустой , либо закончен. Например, объекты * :: 1013 * Thread :: Queue могут иметь конец , а очереди Python могут отслеживать выполненных задач .

. следить за количеством выполненных задач самостоятельно, используя собственную переменную условия и мьютекс или «защелку обратного отсчета» или что-то еще, и не заботиться о рабочих потоках. Они будут испарены при выходе из программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...