【问题标题】:Is the C standard time() function thread safe even if provided a NULL parameter?即使提供了 NULL 参数,C 标准 time() 函数线程是否安全?
【发布时间】:2015-09-28 07:06:03
【问题描述】:

这似乎是一个愚蠢的问题,但它让我思考......

根据heretime 在兼容系统上必须是线程安全的,对吗?无论函数的参数如何,此要求都成立。如果提供了NULL 参数,则列出了一些不需要线程安全的函数,并且不包括time

所以看起来任何足够符合POSIX 的系统都应该具有time 的线程安全实现。

但是,POSIX 系统是否可以选择实现time_t 以使其成为指针并且仍然兼容?因此,如果提供了一个 NULL 参数来存储结果,那么不会因为它可能会返回指向某个静态存储的指针而对它的线程安全性进行所有赌注吗?或者我在这方面缺少time_t 的一些要求或约定?

我最好如何验证time 在一些UNIX 平台上是线程安全的?特别是AIXHP-UXLinuxSolaris。在调试器中逐步完成反汇编可能会起作用,但实现可能会发生变化。

【问题讨论】:

  • pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/… : time_t 和 clock_t 应为整数或实浮点类型。分配它们应该是线程安全的。
  • time 是一个足够愚蠢的函数。出于兼容性原因,我们不能破坏它的签名,但几乎没有理由让它变得更加愚蠢并允许线程不安全的实现。
  • @marcolz 谢谢。不知道我是怎么错过的。

标签: c multithreading posix


【解决方案1】:

是的,它是线程安全的。

time_t time( NULL );

如果它实现了一个内部值,那么在它返回时,它总是必须从内部值复制到返回值(寄存器?)。该副本将使其成为线程安全的,因为它适合所有现代处理器的单一副本。

mov eax, static_internal_value
return

想象一下,情况并非如此,有 2 个线程进来。它们都会复制相同的值 - 再说一次,看不出这怎么可能是不正确的。

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 必须是线程安全的,所以它是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2013-11-27
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-20
相关资源
最近更新 更多