【发布时间】:2013-08-23 16:30:23
【问题描述】:
mktime 的手册页没有提到 mktime 的线程安全,但确实提到了这一点,这使它看起来像线程 unsafe:
调用 mktime() 还会设置外部变量 tzname 与有关当前时区的信息。
我知道在Linux上mktime调用tzset来设置tzname,这是一个char*[]:
extern char *tzname[2];
并且 tzset 将读取环境变量 TZ 和文件 /etc/localtime.因此,除非 mktime 使用互斥锁来保护所有这些操作,否则我看不出它如何是线程安全的。
【问题讨论】:
-
@ShafikYaghmour 上一个问题及其答案集中在
asctime、ctime、gmtime和localtime,它们返回指向静态数据的指针,因此在设计上是线程不安全的。这个问题专门针对mktime,其接口不是线程不安全的,但POSIX 额外规定的副作用可能是。因此,这不是上一个问题的重复。 -
没错,我认为前两行添加的有点误导,上一个问题没有回答任何关于mktime的问题。
-
@user4815162342 如果 C 标准和 POSIX 冲突,那么 C standard wins。 C 标准表明
mktime是线程安全的,因为我对我作为 dup 指出的问题的回答在最后解释。 -
@ShafikYaghmour C99 并不表示
mktime是线程安全的,因为线程不是 C99 的一部分 - 它的状态是后续调用不会超出先前调用的结果(或,更准确地说,它没有说明这种事情可能发生)。 POSIXmktime包含与 C99 中的功能不冲突的附加功能,因此“如果发生冲突,C 获胜”规则不适用。同样,问一下 POSIX 添加的功能是否是线程安全的也是很合理的。
标签: c linux thread-safety