gpt4 book ai didi

c++ - 用于时区规则的 Linux/跨平台 API? (替换锁定 localtime_r)

转载 作者:IT王子 更新时间:2023-10-29 00:54:59 25 4
gpt4 key购买 nike

我们有一些代码想要从多个线程中经常调用 localtime。 (相关背景:它是一个服务器,你可以向它请求的其中一件事是本地时间作为一个字符串,它希望能够每秒处理 100Ks 的请求。)

我们发现在 Ubuntu Linux 12.04 上,glibc 函数 localtime_r(“可重入本地时间”)调用 __tz_convert,这 still takes a global lock!

(另外,看起来 FreeBSD 使 localtime_r 在每次调用时都调用 tzset,因为他们偏执地认为程序可能已经完成了 setenv("TZ") 和/或用户从现在到上次调用 localtime_r 期间下载了新版本的 /etc/localtime。(这与描述的情况相反 here ;似乎 glibc 调用 tzset on every invocation of localtime but not localtime_r ,只是为了混淆。)

显然,这对性能来说很糟糕。出于我们的目的,我们希望在服务器开始运行时基本上“快照”我们当前时区的规则,然后永远使用该快照。所以我们会继续遵守夏令时规则(因为何时切换到 DST 的规则将成为快照的一部分),但我们永远不会回到磁盘、获取互斥锁或做任何其他会导致线程的事情阻止。 (我们可以不考虑对 tzinfo 的下载更新,也不考虑对 /etc/localtime 的更改;我们不希望服务器在运行时物理上更改时区。)

然而,我无法在网上找到任何关于如何处理时区规则的信息——是否有一个用户空间 API 来处理它们,或者我们是否会被迫重新实现几百行 glibc 代码来阅读我们自己的时区数据。

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

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

最佳答案

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

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

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

关于c++ - 用于时区规则的 Linux/跨平台 API? (替换锁定 localtime_r),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19324359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com