FloatToStr/DateToStr的线程安全性

jpf*_*ius 5 delphi multithreading thread-safety delphi-xe

我刚刚在文档中发现FloatToStr并且DateToStr在它们的单参数重载中不是线程安全的.原因是他们访问存储在全局变量中的本地化信息.

我的问题是:如果我不在运行时更改格式设置,这是否具有实际意义?据我了解,只要每个人都只读取格式设置 - 即使是多个线程,我也是安全的.

这是真的还是我错过了什么?

谢谢.

小智 14

FloatToStr,DateToStr和其他类似的函数正在读取全局格式设置.因此,如果您的应用程序没有更改这些函数调用的这些设置,那么它是线程安全的.对面的以下代码不是线程安全的:

DecimalSeparator := ',';
try
  s := FloatToStr(123.45);
finally
  DecimalSeparator := '.';
end;
Run Code Online (Sandbox Code Playgroud)

当您需要踏板安全和"本地"格式设置时,您必须使用重载函数,这些函数作为最后一个参数:AFormatSettings:TFormatSettings.因此,要使上面的代码线程安全,你必须写:

var
  fs: TFormatSettings;

GetLocaleFormatSettings(GetThreadLocale, fs);
fs.DecimalSeparator := ',';
s := FloatToStr(123.45, fs);
Run Code Online (Sandbox Code Playgroud)

笔记:

  1. 可以调用GetLocaleFormatSettings和fs初始化一次,然后可以多次使用fs.这将加速代码.
  2. 而不是GetLocaleFormatSettings可以使用TFormatSettings.Create.我不确定何时引入,但我在Delphi XE中看到了.