поймать выходной поток в с - PullRequest
0 голосов
/ 28 января 2012

У меня есть пул потоков. Функция main () запускает классическую настройку пула. Босс и несколько рабочих потоков. Большая часть кода завершена, однако отсутствующей частью является обработка ошибок.

Когда происходит ошибка с одним из потоков босса / рабочего, вызывается pthread_exit (). Как поток main () узнает, что в пуле что-то пошло не так, чтобы перезапустить его?

Ответы [ 2 ]

0 голосов
/ 28 января 2012

Если вы хотите сохранить информацию об ошибке или восстановлении или хотите получить неблокирующую функцию, вы можете использовать переменную условия вместе со связанным мьютексом и структурой, содержащей сбойный поток, ошибку и необходимую вам информацию восстановления. Все эти переменные должны быть глобальными.

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);
0 голосов
/ 28 января 2012

Вы можете использовать:

pthread_join( pthread_t child, void** );

, чтобы получить возвращаемое значение ваших потоков.pthread_join - это блокирующая функция, которая будет ожидать выхода из потока.Вы можете передать аргумент для pthread_join из:

void pthread_exit(void *value_ptr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...