How to wake the sleeping threads and exit the main thread?

百般思念 提交于 2021-02-10 22:23:14

问题


I am creating 10 threads. Each thread will do some task. There are 7 tasks to be done. Since number of tasks are less than the number of threads, there would always be 3 threads that sleep and do nothing.

My main thread must wait for the tasks to get completed and exit only when all the tasks are done (i.e when the thread exits). I am waiting in a for loop and calling pthread_join but with the 3 threads that are sleeping, how can I wake them up and make them exit?

Here is what I am doing now.

// 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:


The simplest thing to do would be to enqueue dummy tasks that indicate "all done" to the workers, since you know the number of workers in advance:

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

Alternatively, you can have a "breakable" queue. This queue wakes up waiting consumers with a compound predicate: either non-empty or finished. Perl's Thread::Queue objects can be ended, for example, and Python's queues can track completed tasks.

Another option would be to keep track of the number of tasks completed yourself, with its own condition variable and mutex or a "countdown latch" or whatever, and not care about the worker threads. They'll be vaporized when the program exits.



来源:https://stackoverflow.com/questions/60079767/how-to-wake-the-sleeping-threads-and-exit-the-main-thread

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!