即使提供了空参数,C标准的time()函数是否是线程安全的?

7

看起来有点愚蠢的问题,但让我思考了一下...

根据这里的说明,在符合标准的系统上,time需要是线程安全的,对于函数的参数没有要求。如果提供了一个NULL参数,则列出了一些不需要是线程安全的函数,但time并未包括在内。

因此,任何足够符合POSIX标准的系统都应该具有线程安全的time实现。

然而,一个POSIX系统是否可以选择以使其成为指针的方式来实现time_t,并仍然保持符合标准?因此,如果提供了一个NULL参数来存储结果,那么它的线程安全性可能会被打破,因为它很可能会返回指向某些静态存储的指针。或者我在这个方面漏掉了一些关于time_t的要求或约定吗?

如何最好地验证在几个UNIX平台上的time是否是线程安全的?特别是AIXHP-UXLinuxSolaris。通过调试器逐步执行汇编代码可能有效,但实现可能会改变。


6
time_t和clock_t应该是整型或实浮点型。对它们进行赋值时应该是线程安全的。 - marcolz
“time”函数本身已经够傻了。出于兼容性的原因,我们不能打破它的签名,但是让它变得更加傻乎乎并允许线程不安全的实现却毫无意义。 - MSalters
@marcolz 谢谢。不确定我是怎么错过那个的。 - Kizaru
1个回答

4

是的,它是线程安全的。

time_t time( NULL );

如果实现了一个内部值,在返回时,它总是需要从内部值复制到返回值(寄存器?)。该复制将使其线程安全,因为它适用于所有现代处理器的单个复制。
mov eax, static_internal_value
return

假设情况不是这样的,有两个线程进来。它们都会复制相同的值 - 我无法看出这可能是错误的。
thread 1                                    thread 2
                                            mov eax, static_internal_value
mov eax, static_internal_value
return 
                                            return

有几件事情。我不知道 time_t 必须是整数或浮点类型的要求。这就排除了我的假想指针情况。其次,你的文章假定一个原子双字存储器。这通常是正确的,但 x86 架构不是我列出的平台的架构。即使 time_t 要求是整数或浮点数,符合规范的实现可能具有 8 字节的 time_t,在某些平台上可能没有原子加载/存储。POSIX 规范说 time 必须是线程安全的,所以它是线程安全的。 - Kizaru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接