glibc может обрабатывать файлы базы данных часовых поясов, которые содержат информацию о високосных секундах, а gmtime
и gmtime_r
учитывают эти високосные секунды.(Например, пакет Debian tzdata
предоставляет такие файлы часовых поясов в каталоге /usr/share/zoneinfo/right
.) Вот почему реализация glibc читает базу данных часовых поясов и выполняет некоторую блокировку, связанную с этим.
Яне знаю, кто на самом деле использует високосный функционал.В настоящее время POSIX требует, чтобы счетчик, так как эпоха не учитывает никаких високосных секунд, поэтому использование файлов данных с високосными секундами приводит к несоответствующему поведению таких функций, как gmtime
.
Однако я ожидаю, что некоторыенепереносимое программное обеспечение основано на том факте, что вызов gmtime
или gmtime_r
выполняет неявный вызов tzset
, тем самым инициализируя tzname
и другие глобальные переменные.Это больший барьер для устранения блокировки в текущей реализации.(Кто-то даже объявил награду за это, но при 100 долларах США она совершенно непропорциональна усилиям, необходимым для ее исправления.)
Если вам необходимо избежать блокировки сегодня, вам нужно поискать gmtime
алгоритм ( Календарные вычисления - интересный справочник по этим вопросам) и реализуйте его самостоятельно.