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但我不确定它是否有用.)
使用https://github.com/google/cctz
它速度很快,并且可以通过一个非常简单的 API 完成您想要的一切。
特别是,对于相当于 的 cctz localtime
,请使用该cctz::BreakTime()
函数。例如,https://github.com/google/cctz/blob/master/examples/example3.cc
归档时间: |
|
查看次数: |
679 次 |
最近记录: |