用于时区规则的Linux/crossplatform API?(替换lock localtime_r)

Quu*_*one 6 c++ linux timezone multithreading

我们有一些代码想要localtime经常从多个线程调用.(相关背景:它是一个服务器,你可以要求它的一个东西是作为字符串的本地时间,它希望能够每秒提供100K的请求.)

我们发现在Ubuntu Linux 12.04上,glibc函数localtime_r("reentrant localtime")调用__tz_convert,仍然需要全局锁定!

(此外,它看起来像FreeBSD的,使localtime_r通话tzset每一次调用,因为他们是偏执狂,该方案可能会做一个setenv("TZ")和/或用户下载的新版本/etc/localtime现在之间上次localtime_r被调用.(这是相反的这里描述的情况;似乎glibc调用tzset 每次调用localtime但不是localtime_r,只是为了让人困惑.)

显然,这对于表现来说太糟糕了.出于我们的目的,我们希望在服务器开始运行时基本上"快照"当前时区的规则,然后永远使用该快照.因此,我们将继续遵守夏令时规则(因为何时切换到DST的规则将成为快照的一部分),但我们永远不会回到磁盘,接受互斥,或做任何会导致线程的其他事情阻止.(我们没有尊重tzinfo的下载更新并且不尊重更改/etc/localtime;我们不希望服务器在运行时物理地更改时区.)

但是,我无法在网上找到有关如何处理时区规则的任何信息 - 是否存在用于处理时区规则的用户空间API,或者我们是否会被迫重新实现几百行glibc代码以自行读取时区数据.

我们是否必须重新实现下游的所有内容__tz_convert- 包括tzfile_read,因为它似乎没有暴露给用户?或者是否有一些POSIX接口和/或第三方库可用于处理时区规则?

(我见过http://www.iana.org/time-zones/repository/tz-link.html但我不确定它是否有用.)

Gre*_*ler 3

使用https://github.com/google/cctz

它速度很快,并且可以通过一个非常简单的 API 完成您想要的一切。

特别是,对于相当于 的 cctz localtime,请使用该cctz::BreakTime()函数。例如,https://github.com/google/cctz/blob/master/examples/example3.cc

  • 一般来说,指向工具或库的链接[应附有使用说明、链接资源如何适用于问题的具体说明或一些示例代码](http://meta.stackoverflow.com/a/251605) ,或者如果可能的话以上所有。 (2认同)