Linux上的标准C mktime线程安全吗?

swa*_*ang 7 c linux thread-safety

mktime的手册页没有提到mktime的线程安全性,但它确实提到了这看起来像线程不安全:

调用mktime()还会将外部变量tzname设置为有关当前时区的信息.

我知道在Linux上mktime调用tzset来设置tzname,这是一个char*[]:

extern char*tzname [2];

和tzset将读取环境变量TZ和文件/ etc/localtime.因此,除非mktime使用互斥锁来保护所有这些操作,否则我无法看到它是如何保证线程安全的.

use*_*342 9

确实mktime有副作用,但在大多数程序中副作用应该是无害的.

根据POSIX,副作用就像调用了tzset一样,后者只是将时区信息从TZ环境变量复制到tznameC字符串数组.如果您的应用程序没有更改TZ,那么mktime()并发调用就没有问题.

除此之外,GNU libc tzset 确实使用互斥锁来保护其完整性tzname.这是标准不保证的实施质量补充.