我可以假设DelphiNow函数是线程安全的吗?

我可以假设DelphiNow函数是线程安全的吗?,delphi,time,thread-safety,Delphi,Time,Thread Safety,如果我现在从多个线程中调用,我是否可以假定这是正常的,或者我是否需要为此实现锁定?我知道日期时间格式不安全,但是日期时间读取呢? 另外,QueryPerformanceCounter呢?我已经看过了,但找不到关于这些低级函数的线程安全性的任何明确文档。您有权访问SysUtils.pas?我有我的旧Delphi4源代码,在Source\Rtl\Sys\SysUtils.pas中是Now()的实现。它似乎使用了WinAPIGetLocalTime()和自己的EncodeDate()和EncodeTi

如果我现在从多个线程中调用,我是否可以假定这是正常的,或者我是否需要为此实现锁定?我知道日期时间格式不安全,但是日期时间读取呢?
另外,QueryPerformanceCounter呢?我已经看过了,但找不到关于这些低级函数的线程安全性的任何明确文档。

您有权访问
SysUtils.pas
?我有我的旧Delphi4源代码,在
Source\Rtl\Sys\SysUtils.pas
中是
Now()的实现。它似乎使用了WinAPI
GetLocalTime()
和自己的
EncodeDate()
EncodeTime()
函数。它们都是线程安全的,因此
Now()
也是线程安全的。

Now是线程安全的。如果你做得对,日期格式也可以。QueryPerformanceCounter也是线程安全的。Windows API是线程安全的。当API函数不是线程安全的时,文档应向您发出警告。默认情况下,现在函数是线程安全的。正确设置日期格式意味着使用接受
t格式设置
参数的函数版本。或者调用不接收参数的函数,并且从不更改全局格式设置变量(如果这就是它的名称)@Golez这正是我所说的。只要您从不更改共享数据,它就是线程安全的;b();结果:=c();仍然可以是线程不安全的代码是的,但是
Now()
只使用它自己的变量,并且应该没有副作用。@Michal-有趣,是的。我有自己的“Now”,它调用QueryPerformanceCounter以获得100ns分辨率的TDateTime,因此是的,安全的“线程安全”结论适用。
TDateTime
只有毫秒精度,那么为什么要使用QPC(众所周知,在多CPU环境中,QPC是不安全的,顺便说一句)要获取纳秒分辨率日期/时间值?@RemyLebeau QPC为我们提供硬件脉冲和持续时间,持续时间为微秒,如果您进行一些测试,TDateTime(双BTW)可以保持此分辨率。Now和GETICKCount函数的分辨率为1ms。