Почему gmtime_r вызывает __tz_convert, который захватывает глобальную блокировку? - PullRequest
0 голосов
/ 21 декабря 2018

Я был удивлен, увидев, что gmtime_r действительно вызывает tz-что угодно.Я полагаю, причина локального времени по сравнению с gmtime заключается в том, что первое делает преобразования tz, тогда как второе не нужно.Похоже, что gmtime вызывает __tz_convert, который затем идет вперед и захватывает глобальную блокировку tz (которая даже не нужна ... верно?) Я что-то здесь упускаю?Как получить эффективное преобразование epoch -> struct tm в многопоточном приложении?

(gdb) where
#0  0x00007fffee255eec in __lll_lock_wait_private () from /lib64/libc.so.6
#1  0x00007fffee2007bc in _L_lock_2546 () from /lib64/libc.so.6
#2  0x00007fffee2005f7 in __tz_convert () from /lib64/libc.so.6
#3  0x000000000041c63f in DateTimeEx (dt=..., this=0x7fffca551900) at /var/lib/jenkins/workspace/hfalgo_src_hotfix_1.69.1-T6J4HNFQDMYVEKV4MEGVD6UCCPG7KHWQDOSVYBUDROFXZA6YINSA/hfalgo_src/./core/Time.h:81

1 Ответ

0 голосов
/ 21 декабря 2018

glibc может обрабатывать файлы базы данных часовых поясов, которые содержат информацию о високосных секундах, а gmtime и gmtime_r учитывают эти високосные секунды.(Например, пакет Debian tzdata предоставляет такие файлы часовых поясов в каталоге /usr/share/zoneinfo/right.) Вот почему реализация glibc читает базу данных часовых поясов и выполняет некоторую блокировку, связанную с этим.

Яне знаю, кто на самом деле использует високосный функционал.В настоящее время POSIX требует, чтобы счетчик, так как эпоха не учитывает никаких високосных секунд, поэтому использование файлов данных с високосными секундами приводит к несоответствующему поведению таких функций, как gmtime.

Однако я ожидаю, что некоторыенепереносимое программное обеспечение основано на том факте, что вызов gmtime или gmtime_r выполняет неявный вызов tzset, тем самым инициализируя tzname и другие глобальные переменные.Это больший барьер для устранения блокировки в текущей реализации.(Кто-то даже объявил награду за это, но при 100 долларах США она совершенно непропорциональна усилиям, необходимым для ее исправления.)

Если вам необходимо избежать блокировки сегодня, вам нужно поискать gmtimeалгоритм ( Календарные вычисления - интересный справочник по этим вопросам) и реализуйте его самостоятельно.

...