我可以假设 Delphi NOW 函数是线程安全的吗?
Posted
技术标签:
【中文标题】我可以假设 Delphi NOW 函数是线程安全的吗?【英文标题】:Can I assume that the Delphi NOW function will be thread safe? 【发布时间】:2012-11-29 07:57:34 【问题描述】:如果我从多个线程中调用 NOW,我可以假设这没问题还是我需要为此实现锁定?我知道日期时间格式不安全,但是日期时间读取呢? 另外,QueryPerformanceCounter 呢?我已经查看但找不到任何关于这些低级函数的线程安全的权威文档。
【问题讨论】:
现在是线程安全的。如果你做得对,日期格式也是如此。 QueryPerformanceCounter 也是线程安全的。 Windows API 是线程安全的。 当 Api 函数不是线程安全的时,文档应该会发出警告。现在默认函数是线程安全的。 正确的日期格式意味着使用带有TFormatSettings
参数的函数版本。
或者调用不接收参数并且从不更改全局 FormatSettings 变量的函数(如果是这样的话)
@Golez 这正是我所说的。只要您从不更改共享数据,它就是线程安全的。
【参考方案1】:
您可以访问SysUtils.pas
吗?我有我的旧 Delphi4 源代码,Source\Rtl\Sys\SysUtils.pas
是Now()
的实现。似乎它使用了 Win API GetLocalTime()
和它自己的 EncodeDate()
和 EncodeTime()
函数。它们都是线程安全的,所以Now()
也是线程安全的。
【讨论】:
在函数体中调用线程安全函数 - a(); b();结果 := c();仍然可以是线程不安全的代码 可以,但是Now()
只使用自己的变量,应该没有副作用。
@Michal - 有趣,是的。我有自己的“现在”,它调用 QueryPerformanceCounter 来获得分辨率为 100ns 的 TDateTime,所以是的,安全的“线程安全”结论适用。
TDateTime
只有毫秒精度,那么为什么要使用 QPC(在多 CPU 环境中不安全,顺便说一句)来检索纳秒分辨率的日期/时间值?
@RemyLebeau QPC 为我们提供了硬件脉冲和持续时间到微秒持续时间,如果您进行一些测试 TDateTime 这是一个双 BTW 可以保持这个分辨率。分辨率为 1 毫秒的是 Now 和 GetTickCount 函数。以上是关于我可以假设 Delphi NOW 函数是线程安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章