Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使提供了NULL参数,C standard time()函数也是线程安全的吗?_C_Multithreading_Posix - Fatal编程技术网

即使提供了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
必须是线程安全的,事实也是如此。