Вы спрашиваете о процессах или потоках?Функция wait
действует на процессы, а не на потоки, поэтому заданный вопрос недопустим.
Для (дочерних) процессов вы можете проверить состояние, вызвав waitid
с флагом WNOWAIT
,Это оставит процесс в состоянии ожидания.
Для потоков в некоторых реализациях вы можете вызвать pthread_kill(thread, 0)
и проверить на ESRCH
, чтобы определить, завершился ли поток или нет, оставив thread
вприсоединяемое государство.Обратите внимание, что это действительно , только если поток является присоединяемым .Если он был отсоединен или уже присоединен, вы вызываете Undefined Behavior, и ваша программа должна аварийно завершить работу или еще хуже.К сожалению, в этом случае не требуется, чтобы pthread_kill
сообщал ESRCH
, поэтому он может ложно сообщить, что поток все еще существует, хотя фактически он уже завершен.Конечно, формально нет никакой разницы между потоком, который вечно сидит между вызовом pthread_exit
и фактическим завершением, и потоком, который фактически завершил завершение, поэтому вопрос немного бессмысленный.Другими словами, не требуется, чтобы присоединяемый поток завершался до тех пор, пока pthread_join
не будет заблокирован в ожидании завершения.