我可以假设 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.pasNow() 的实现。似乎它使用了 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 函数是线程安全的吗?的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 的 TADOConnection 线程安全吗?

delphi中的线程安全

线程安全和静态函数

delphi真正实现延时暂停功能

Delphi怎样实现多线程

C/C++线程安全型队列的实现