Блокировки чтения-записи в relibc научились ждать по часам реального времени

29.03.2026

В relibc реализованы pthread_rwlock_clockrdlock и pthread_rwlock_clockwrlock, а обработка таймаутов в блокировках чтения-записи переведена на часы реального времени вместо системного времени процесса.

Про блокировки чтения-записи

Блокировка чтения-записи отличается от обычной тем, что читать могут сразу несколько потоков, а писать — только один. Это основа для структур данных, которые читают часто, а изменяют редко.

Дополнительно есть варианты с ожиданием по времени, чтобы поток не зависал навсегда.

Почему важно, по каким часам идёт ожидание

Системное время процесса можно двигать: администратор вправе изменить его, и обновление часов тоже сдвигает показания. Реальное время идёт монотонно и не поддаётся изменению.

Разница проявляется там, где таймаут должен означать «прошло примерно столько-то времени на самом деле». Если внутри таймаута системное время дёрнули, ожидание либо оборвётся слишком рано, либо растянется. Для программы, которая ждёт готовности сокета или состояния shared memory с ограничением по времени, это означает ошибки, зависящие от нагрузки и прав администратора.

В relibc обработка таймаутов переведена на реальное время и добавлена обработка идентификатора часов, который передаётся в эти функции.

Практическая польза

Обе функции широко используются в крейтах для Rust: parking_lot и пулы исполнения асинхронных задач опираются на блокировки с таймаутами. До этого вызовы либо не собирались, либо вели себя не по стандарту.

Оригинал

Коммит Implement clockid_t handling to pthread_rwlock timeout от 29 марта 2026 года в репозитории redox-os/relibc; рядом правка pthread_rwlock_timed[rd/rw]lock с переводом на часы реального времени. Сводка «This Month in Redox — March 2026», раздел «Relibc Improvements»

Упоминаний: 1 · Просмотров: 2