On 12/15/2017 01:25 AM, Guy Harris wrote:
as I read the Single UNIX Specification, localtime_r() (not surprisingly) honors TZ, but does not necessarily honor*changes* in TZ unless you call tzset() before calling localtime_r().
Yes, that's my understanding too (and I agree POSIX is vague here). That is, as I understand it, although localtime_r and tzset are both required to lock each other out safely, localtime_r is not required to call tzset (though it is allowed to). Also, behavior is undefined if one thread calls tzset (perhaps via localtime, ugh) while another thread is modifying TZ or any other environment variable (either directly, or via putenv/setenv). Portable multithreaded programs need to call tzset before they start threads that care about time, and they should run all their threads in the same time zone. This limitation is fixed by localtime_rz etc., which is in the reference implementation and in NetBSD but not elsewhere (yet).