【发布时间】:2011-06-06 20:16:43
【问题描述】:
我正在编写一个应用程序来将 utc-time 转换为不同的时区,现在我可以使用这样的东西
putenv("TZ=TIMEZONE1");
tzset()
...
do time conversions
但我认为它不是线程安全的,所以有没有任何 C/C++ 库可以通过将时区作为函数的参数而不是某个全局变量来进行时区转换
【问题讨论】:
标签: c++ c linux multithreading
我正在编写一个应用程序来将 utc-time 转换为不同的时区,现在我可以使用这样的东西
putenv("TZ=TIMEZONE1");
tzset()
...
do time conversions
但我认为它不是线程安全的,所以有没有任何 C/C++ 库可以通过将时区作为函数的参数而不是某个全局变量来进行时区转换
【问题讨论】:
标签: c++ c linux multithreading
您可能需要自己的能够处理时区的代码/库。标准库的处理非常落后,不适合处理比在程序生命周期内固定的单个时区更复杂的东西。
不过,一种可能的解决方案是分配共享内存fork,并更改子进程中的时区,然后通过共享内存将结果传回以在waitpid 返回父进程后读取。这有点贵,但并不像听起来那么糟糕,因为fork 在现代系统上速度很快。我的经验是 1 fork 等于 2-3 pthread_create 电话,1 pthread_create 电话等于 2-3 open 电话。由于更改时区需要打开一个或多个文件并对它们执行 IO,因此您可能不会将总时间成本增加超过 3-5 倍。如果您可以为您正在使用的每个时区保留一个子进程,那么它当然会更有效。
【讨论】:
Boost.DateTime 支持时区转换。
【讨论】:
sudo apt-get install libboost-date-time1.40-dev,我准备好了!