У меня странная проблема. У меня есть следующий код:
dbg("condwait: timeout = %d, %d\n",
abs_timeout->tv_sec, abs_timeout->tv_nsec);
ret = pthread_cond_timedwait( &q->q_cond, &q->q_mtx, abs_timeout );
if (ret == ETIMEDOUT)
{
dbg("cond timed out\n");
return -ETIMEDOUT;
}
dbg
вызывает gettimeofday
перед каждой строкой и добавляет строку со временем. Это приводит к следующему выводу:
7.991151: condwait: timeout = 5, 705032704
7.991158: cond timed out
Как видите, между двумя линиями отладки прошло всего 7 микросекунд, но pthread_cond_timedwait
вернул ETIMEDOUT
. Как это может случиться? Я даже пытался установить часы на что-то другое при инициализации переменной cond:
int ret;
ret = pthread_condattr_init(&attributes);
if (ret != 0) printf("CONDATTR INIT FAILED: %d\n", ret);
ret = pthread_condattr_setclock(&attributes, CLOCK_REALTIME);
if (ret != 0) printf("SETCLOCK FAILED: %d\n", ret);
ret = pthread_cond_init( &q->q_cond, &attributes );
if (ret != 0) printf("COND INIT FAILED: %d\n", ret);
(ни одно из сообщений об ошибке не распечатывается). Я пробовал как CLOCK_REALTIME
, так и CLOCK_MONOTONIC
.
Этот код является частью очереди блокировки. Мне нужна такая функциональность, чтобы, если через 5 секунд в эту очередь ничего не помещалось, происходило что-то еще. И мьютекс, и cond инициализируются, поскольку очередь блокировки работает нормально, если я не использую pthread_cond_timedwait
.