我们有一些代码想要localtime
经常从多个线程调用。(相关背景:它是一个服务器,您可以要求它以字符串形式的本地时间,它希望能够每秒处理 100Ks 的请求。)
我们发现,在 Ubuntu Linux 12.04 上,glibc 函数localtime_r
(“reentrant localtime”)调用__tz_convert
仍然需要全局锁!
(此外, FreeBSD似乎在每次localtime_r
调用时都会tzset
调用,因为他们偏执于程序可能已经完成了setenv("TZ")
和/或用户下载了/etc/localtime
从现在到上次localtime_r
调用的新版本。(这是相反的这里描述的情况;似乎 glibctzset
每次调用localtime
but notlocaltime_r
,只是为了混淆。)
显然,这对性能来说是很糟糕的。出于我们的目的,我们希望在服务器开始运行时基本上“快照”我们当前时区的规则,然后永远使用该快照。所以我们将继续遵守夏令时规则(因为何时切换到 DST 的规则将成为快照的一部分),但我们永远不会回到磁盘、使用互斥锁或做任何其他会导致线程的事情阻止。(我们可以不尊重 tzinfo 的下载更新,也不尊重对 的更改/etc/localtime
;我们不希望服务器在运行时物理更改时区。)
但是,我在网上找不到任何关于如何处理时区规则的信息——是否有用户空间 API 可以使用它们,或者我们是否将被迫重新实现几百行 glibc 代码来自己读取时区数据.
我们是否必须重新实现下游的所有内容__tz_convert
——包括tzfile_read
,因为它似乎没有暴露给用户?或者是否有一些 POSIX 接口和/或第三方库可用于处理时区规则?
(我看过http://www.iana.org/time-zones/repository/tz-link.html但我不确定它是否有用。)