Search code examples
multithreadingdelphithread-safetydelphi-2009

Is FormatDateTime thread safe when using the same copy of TFormatSettings across multiple threads?


I've read a lot about thread safety when reading variable simultanously from multiple threads but I am still not sure whether my case is fine or not.

Consider that I have:

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.
    );

Can I use FormatDateTime('dd/mm/yyyy hh:nn:ss', MySettings, Now) in multiple threads without worries or should I spawn a separate copy of MySettings for each thread?


Solution

  • Yes this is perfectly safe.

    As long as MySetting is not changed this is the way to use FormatDateTime and other similar procedures.

    From documentation, System.SysUtils.TFormatSettings:

    A variable of type TFormatSettings defines a thread-safe context that formatting functions can use in place of the default global context, which is not thread-safe.


    N.B. You must provide this thread-safe context by programming. It is thread-safe only if you ensure that the parameter and its shares is not changed during execution.

    Typically my serializing libraries are using a shared constant format setting variable, which provides a stable read/write interface in all locales.