Если вы хотите сохранить информацию об ошибке или восстановлении или хотите получить неблокирующую функцию, вы можете использовать переменную условия вместе со связанным мьютексом и структурой, содержащей сбойный поток, ошибку и необходимую вам информацию восстановления. Все эти переменные должны быть глобальными.
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
struct error_info err;
В потоке босса вы должны сначала инициализировать структуру ошибок, а затем заблокировать мьютекс.
pthread_mutex_lock(&mutex);
Затем вы ждете возникновения условия, используя pthread_cond_wait.
pthread_cond_wait(&cond, &mutex);
После возникновения условия вы обрабатываете ошибку и используете pthread_join, чтобы получить возвращаемое значение из вашего потока. Обратите внимание, что pthread_cond_wait является блокирующим, если вы хотите неблокирующую версию, вы должны использовать pthread_cond_timedwait, который имеет третий параметр, struct timespec *, который содержит абсолютное системное время, в которое истекает ожидание. В конце не забудьте разблокировать мьютекс.
pthread_mutex_unlock(&mutex);
В работающем с ошибкой рабочем потоке перед выходом необходимо сначала заблокировать мьютекс, затем заполнить структуру с ошибками, дать сигнал боссовому потоку, разблокировать мьютекс и выйти. Чтобы сообщить нити босса, вы должны использовать функцию pthread_cond_signal.
pthread_cond_signal(&cond);