Если дочерний поток действительно завершает работу (а не ожидает дополнительной работы), родительский поток может вызвать для него pthread_join
, который будет блокироваться до выхода из дочернего потока.
Очевидно, что если родительский поток выполняет другие действия, он не может постоянно блокироваться на pthread_join
, поэтому вам нужен способ отправить сообщение в основной поток, чтобы сказать ему, чтобы он вызывал pthread_join
. Существует ряд механизмов IPC, которые вы могли бы использовать для этого, но в вашем конкретном случае (сервер TCP), я подозреваю, что основной поток, вероятно, представляет собой цикл select
, верно? Если это так, я бы порекомендовал использовать pipe
для создания логического канала, и чтобы дескриптор чтения для канала был одним из дескрипторов, из которых выбирается основной поток.
Когда дочерний поток завершает свою работу, он записывает в канал какое-то сообщение с надписью "I'm Done!" и тогда сервер узнает, что нужно вызвать pthread_join
в этом потоке, а затем сделать все остальное, что ему нужно сделать, когда соединение завершится.
Обратите внимание, что у вас нет для вызова pthread_join
в готовом дочернем потоке, если только вам не нужно его возвращаемое значение. Однако, как правило, это хорошая идея, если дочерний поток имеет какой-либо доступ к общим ресурсам, поскольку, когда pthread_join
возвращается без ошибок, он гарантирует, что дочерний поток действительно пропал, а не в промежуточном состоянии между отправкой "Я готов!" сообщение и фактически выйдя.