即使提供了NULL参数,C standard time()函数也是线程安全的吗?
看起来有点傻,但这让我想 根据,即使提供了NULL参数,C standard time()函数也是线程安全的吗?,c,multithreading,posix,C,Multithreading,Posix,看起来有点傻,但这让我想 根据,时间在兼容系统上必须是线程安全的,对吗?无论函数的参数如何,此要求都适用。如果提供了NULL参数,并且不包括time,则一些函数被列为不需要线程安全 因此,看起来任何符合POSIX标准的系统都应该有时间的线程安全实现 然而,POSIX系统是否可以选择实现time\t,使其成为一个指针,并且仍然是兼容的?因此,如果提供一个NULL参数来存储结果,那么对其线程安全性的所有押注都不会被取消,因为它可能会返回指向某个静态存储的指针?或者,在这方面,我是否缺少对时间的一些要
时间
在兼容系统上必须是线程安全的,对吗?无论函数的参数如何,此要求都适用。如果提供了NULL
参数,并且不包括time
,则一些函数被列为不需要线程安全
因此,看起来任何符合POSIX标准的系统都应该有时间的线程安全实现
然而,POSIX系统是否可以选择实现time\t
,使其成为一个指针,并且仍然是兼容的?因此,如果提供一个NULL参数来存储结果,那么对其线程安全性的所有押注都不会被取消,因为它可能会返回指向某个静态存储的指针?或者,在这方面,我是否缺少对时间的一些要求或约定
在一些UNIX
平台上,我最好如何验证time
是否是线程安全的?特别是,AIX
、HP-UX
、Linux
和Solaris
。在调试器中单步执行反汇编可以工作,但实现可能会改变 是的,它是线程安全的
time_t time( NULL );
如果它实现了一个内部值,那么在返回时,它总是必须从内部值复制到返回值(register?)。该副本将使其线程安全,因为它将适用于所有现代处理器单个副本
mov eax, static_internal_value
return
想象一下,情况并非如此,有两条线程出现。他们都会复制出相同的值——同样,我看不出这怎么可能是错误的
thread 1 thread 2
mov eax, static_internal_value
mov eax, static_internal_value
return
return
:时间和时钟应为整数或实浮式。分配它们应该是线程安全的。time
是一个非常愚蠢的函数。出于兼容性的原因,我们不能破坏它的签名,但没有理由使它更愚蠢,并允许线程不安全的实现。@marcolz谢谢。不知道我怎么会错过,有几件事。我不知道time\u t
必须是整数或浮点类型。这推翻了我假设的指针情况。第二,你的帖子假设一个原子双字存储。这通常是正确的,但x86体系结构并不是我列出的平台的核心。即使要求time\u t
为整数或浮点,兼容的实现也可能具有8字节time\u t
,在某些平台上可能没有原子加载/存储。POSIX规范说time
必须是线程安全的,事实也是如此。