跨多个线程使用相同的TFormatSettings副本时,FormatDateTime线程是否安全?

时间:2014-11-22 17:00:41

标签: multithreading delphi thread-safety delphi-2009

在从多个线程同时读取变量时,我已经阅读了很多关于线程安全的内容,但我仍然不确定我的案例是否正常。

考虑一下:

const
  MySettings: TFormatSettings =
    (
      CurrencyFormat   : 0;
      NegCurrFormat    : 0;
      ThousandSeparator: ' ';
      DecimalSeparator : '.';
      CurrencyString   : '¤';
      ShortDateFormat  : 'MM/dd/yyyy';
      LongDateFormat   : 'dddd, dd MMMM yyyy';

      //All fields of record are initialized.
    );

我可以在多个线程中使用FormatDateTime('dd/mm/yyyy hh:nn:ss', MySettings, Now)而无需担心,还是应该为每个线程生成MySettings的单独副本?

2 个答案:

答案 0 :(得分:3)

当且仅当在同时调用格式化函数期间未修改格式设置记录时,此方案才是线程安全的。

当且仅当共享对象未被修改时,使用共享全局格式设置记录的旧学校格式化函数才是线程安全的。这是关键点。是否修改了格式设置对象?

我对这一切的看法是你应该避免修改格式设置对象。初始化它们然后永远不会修改它们。这样你就不会遇到线程安全问题。

答案 1 :(得分:1)

是的,这是绝对安全的。

只要不更改MySetting,就可以使用FormatDateTime和其他类似程序。

来自文档System.SysUtils.TFormatSettings

  

TFormatSettings类型的变量定义了一个线程安全的上下文,格式化函数可以使用它来代替默认的全局上下文,这不是线程安全的。


N.B。您必须通过编程提供此线程安全上下文。只有在确保在执行期间不更改参数及其共享时,它才是线程安全的。

通常,我的序列化库使用共享的常量格式设置变量,该变量在所有语言环境中提供稳定的读/写接口。