【问题标题】:Threadsafe way to convert time between timezones在时区之间转换时间的线程安全方法
【发布时间】:2011-06-06 20:16:43
【问题描述】:

我正在编写一个应用程序来将 utc-time 转换为不同的时区,现在我可以使用这样的东西

putenv("TZ=TIMEZONE1"); 
tzset()
...
do time conversions

但我认为它不是线程安全的,所以有没有任何 C/C++ 库可以通过将时区作为函数的参数而不是某个全局变量来进行时区转换

【问题讨论】:

    标签: c++ c linux multithreading


    【解决方案1】:

    您可能需要自己的能够处理时区的代码/库。标准库的处理非常落后,不适合处理比在程序生命周期内固定的单个时区更复杂的东西。

    不过,一种可能的解决方案是分配共享内存fork,并更改子进程中的时区,然后通过共享内存将结果传回以在waitpid 返回父进程后读取。这有点贵,但并不像听起来那么糟糕,因为fork 在现代系统上速度很快。我的经验是 1 fork 等于 2-3 pthread_create 电话,1 pthread_create 电话等于 2-3 open 电话。由于更改时区需要打开一个或多个文件并对它们执行 IO,因此您可能不会将总时间成本增加超过 3-5 倍。如果您可以为您正在使用的每个时区保留一个子进程,那么它当然会更有效。

    【讨论】:

    • +1 用于确认,我希望 libc 等中一定有一些东西,所以看起来像是一个将数据分类到时区的过程,然后为每个时区单独处理是要走的路:(
    【解决方案2】:

    Boost.DateTime 支持时区转换。

    【讨论】:

    • 我从来没有使用过boost,所以我可以只包括boost datetime吗?
    • 好吧,这很容易sudo apt-get install libboost-date-time1.40-dev,我准备好了!
    • 出于好奇,Boost 是否有自己的时区数据库或以某种方式使用系统数据库?
    • 我认为问题在于线程安全。如果不采取额外措施,提升日期时间是否安全? AFAIK 大多数增强模块都不是。
    • 这是个好问题。另请注意,用锁包装调用并不能使其成为线程安全的,因为如果任何其他线程可以访问环境,那么修改环境是危险的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多