Придерживайтесь pthread_cond_timedwait
и используйте clock_gettime
. Например:
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!some_condition && ret == 0)
ret = pthread_cond_timedwait(&cond, &mutex, &ts);
Оберните его в функцию, если хотите.
ОБНОВЛЕНИЕ: дополняет ответ на основе наших комментариев.
POSIX не имеет единого API для ожидания "всех типов" событий / объектов, как в Windows. У каждого свои функции. Самый простой способ уведомить поток о завершении - использовать атомарные переменные / операции. Например:
Основная нить:
// Declare it globally (argh!) or pass by argument when the thread is created
atomic_t must_terminate = ATOMIC_INIT(0);
// "Signal" termination by changing the initial value
atomic_inc(&must_terminate);
Вторичная резьба:
// While it holds the default value
while (atomic_read(&must_terminate) == 0) {
// Keep it running...
}
// Do proper cleanup, if needed
// Call pthread_exit() providing the exit status
Другая альтернатива - отправить запрос на отмену, используя pthread_cancel
. Отменяемый поток должен был вызвать pthread_cleanup_push
, чтобы зарегистрировать любой необходимый обработчик очистки. Эти обработчики вызываются в обратном порядке, в котором они были зарегистрированы. Никогда не вызывайте pthread_exit
из обработчика очистки, потому что это неопределенное поведение. Статус выхода отмененной темы - PTHREAD_CANCELED
. Если вы выберете эту альтернативу, я рекомендую вам прочитать в основном о точках отмены и типах.
И последнее, но не менее важное: вызов pthread_join
сделает текущий поток блокированным, пока поток, переданный аргументом, не завершится. В качестве бонуса вы получите статус выхода потока.