CLOCK_MONOTONIC и pthread_mutex_timedlock/pthread_cond_timedwait - программирование
Подтвердить что ты не робот

CLOCK_MONOTONIC и pthread_mutex_timedlock/pthread_cond_timedwait

Документация pthread_mutex_timedlock говорит, что abs_timeout занимает CLOCK_REALTIME. Тем не менее, мы все знаем, что нецелесообразно определять конкретную продолжительность (из-за корректировки системного времени).

Есть ли способ сделать тайм-аут блокировки pthread на CLOCK_MONOTONIC, который переносится? То же самое происходит с pthread_cond_timedwait.

4b9b3361

Ответ 1

Посмотрев документацию и pthread.h, я не могу найти способ сделать pthread_mutex_timedlock использовать CLOCK_MONOTONIC, чтобы я предположим, что не возможно (в настоящее время). Для pthread_cond_timedwait, вы можете использовать такой код:

pthread_condattr_t attr;
pthread_cond_t cond;
/* ... */
pthread_condattr_init(&attr);
pthread_condattr_setclock(&attr, CLOCK_MONOTONIC);
pthread_cond_init(&cond, &attr);

Я пропустил проверку кода ошибки для ясности, но, конечно, вы должны это сделать.

Я предполагаю, что CLOCK_REALTIME используется, потому что он всегда доступен, тогда как в принципе CLOCK_MONOTONIC является необязательным. Кроме того, я задаюсь вопросом, облегчает ли установка абсолютных тайм-аутов восстановление после того, как системные вызовы прерываются сигналами и т.п.

Однако, кажется, совершенно непоследовательно, что часы могут быть установлены в некоторых случаях, а не в других - действительно, должен быть pthread_mutexattr_setclock(), но, похоже, не существует. Думаю, вам просто нужно надеяться, что кто-то не установит часы!

Ответ 2

В OS X и FreeBSD вы можете использовать kqueue и kevent. См. Мой ответ здесь: fooobar.com/info/327317/...