在从多个线程同时读取变量时,我已经阅读了很多关于线程安全的内容,但我仍然不确定我的案例是否正常。
考虑一下:
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
的单独副本?
答案 0 :(得分:3)
当且仅当在同时调用格式化函数期间未修改格式设置记录时,此方案才是线程安全的。
当且仅当共享对象未被修改时,使用共享全局格式设置记录的旧学校格式化函数才是线程安全的。这是关键点。是否修改了格式设置对象?
我对这一切的看法是你应该避免修改格式设置对象。初始化它们然后永远不会修改它们。这样你就不会遇到线程安全问题。
答案 1 :(得分:1)
是的,这是绝对安全的。
只要不更改MySetting
,就可以使用FormatDateTime
和其他类似程序。
来自文档System.SysUtils.TFormatSettings:
TFormatSettings类型的变量定义了一个线程安全的上下文,格式化函数可以使用它来代替默认的全局上下文,这不是线程安全的。
N.B。您必须通过编程提供此线程安全上下文。只有在确保在执行期间不更改参数及其共享时,它才是线程安全的。
通常,我的序列化库使用共享的常量格式设置变量,该变量在所有语言环境中提供稳定的读/写接口。