为什么glibc(也许是其他人)静态tm struct不是本地的线程?

时间:2015-02-11 17:08:24

标签: c thread-safety

今天正在进行同行评审,有人抱怨以tm tm = *gmtime(&t)的形式使用gmtime。我的假设一直是它会使用每线程存储来使其安全,但环顾四周似乎time/localtime.c只是将其声明为常规全局。

https://sourceware.org/git/?p=glibc.git;a=blob;f=time/localtime.c;h=38f3123d9a4093c3bbd78e4d39f63491af1fed56;hb=master

/* The C Standard says that localtime and gmtime return the same pointer.  */
struct tm _tmbuf;

如果我理解正确,这会使现实系统上的实现完全被破坏,因为可靠地告诉其他线程正在做什么是不切实际的?

为什么它不是按线程制作的,使它像以前一样安全?

我当然意识到这个函数还有其他版本(尽管不是可移植的),所以一个简单的mygmtime包装器是可能的,但看起来很奇怪,这仍然是一个突出的问题。

1 个答案:

答案 0 :(得分:2)

您是正确的gmtime()localtime()函数不是线程安全的。 C库中有很多这样的函数,它们是原样的,因为它们是为单线程程序设计的(曾经是唯一的一种),并且将它们改为依赖线程本地数据将是一种改变他们之前定义的语义。他们并没有完全被打破"因为许多程序只使用一个线程,并且因为它们也可以在多线程程序中使用它们。

话虽如此,这些是可重入版本已标准化的许多函数之一(gmtime_r()localtime_r());如果您可以使用可重入版本,那么它们是多线程程序的更好选择。