The pthread_join() function waits for the thread specified by thread
to terminate. If that thread has already terminated, then
pthread_join() returns immediately. The thread specified by thread
must be joinable.
If retval is not NULL, then pthread_join() copies the exit status of
the target thread (i.e., the value that the target thread supplied to
pthread_exit(3)) into the location pointed to by *retval. If the
target thread was canceled, then PTHREAD_CANCELED is placed in
*retval.
If multiple threads simultaneously try to join with the same thread,
the results are undefined. If the thread calling pthread_join() is
canceled, then the target thread will remain joinable (i.e., it will
not be detached).