cmultithreadingpthreads

Non-blocking pthread_join


I'm coding the shutdown of a multithreaded server.If everything goes as it should all the threads exit by their own, but there's a small chance that a thread gets stuck.In this case it would be convenient to have a non-blocking join so I could do.

Is there a way of doing a non-blocking pthread_join? Some sort of timed join would be good too.

something like this:

foreach thread do
  nb_pthread_join();
    if still running
      pthread_cancel();

I can think more cases where a a non-bloking join would be useful.

As it seems there is no such a function so I have already coded a workaround, but it's not as simple as I would like.


Solution

  • As others have pointed out there is not a non-blocking pthread_join available in the standard pthread libraries.

    However, given your stated problem (trying to guarantee that all of your threads have exited on program shutdown) such a function is not needed. You can simply do this:

    int killed_threads = 0;
    for(i = 0; i < num_threads; i++) {
       int return = pthread_cancel(threads[i]);
       if(return != ESRCH)
          killed_threads++;
    }
    if(killed_threads)
        printf("%d threads did not shutdown properly\n", killed_threads)
    else
        printf("All threads exited successfully");
    

    There is nothing wrong with calling pthread_cancel on all of your threads (terminated or not) so calling that for all of your threads will not block and will guarantee thread exit (clean or not).

    That should qualify as a 'simple' workaround.