背景:我发现一个应用程序在多个线程中使用TRegEx
单例。该单例在类构造函数中初始化为TRegEx.Create(Pattern, [roCompiled])
,线程从RegEx.Match(Value).Groups
开始使用它,但似乎没有使用同步机制,不过应用程序运行正常。不过,这只是TThread.Execute
重载的一小部分,并且线程负载很小。因此,这可能仅仅是运气好,因为线程不太可能在关键部分相互交叉。
TRegEx
实例只持有一个不可变(已编译)模式,并直接使用参数输入,或者在(TMatch
)返回值中保留此输入以供可能的后续操作,例如NextMatch
,它是在TMatch
而非TRegEx
上实现的。 潜在的开源 PCRE 库似乎是线程安全的。所有这些都符合上述情况。另一方面,我认为TRegEx
实例通常不是线程安全的,因为例如,在function TRegEx.Match(const Input: String): TMatch
(如上所示)中,要匹配的字符串似乎首先存储到实例中然后再进行匹配。并且同一个嵌套的TPerlRegEx
实例通过各种函数链传递并保持活动状态。共享的TRegEx
实例似乎需要受到保护,以防止协调不一致的访问,例如使用临界区域。
话虽如此,我怀疑TRegEx不是线程安全的,但我想询问一些了解多线程和裁定线程安全的专业人士进行确认。因此,我的问题非常普遍,独立于其所属应用程序:
问题:TRegEx是否线程安全?
FRegEx
应该是安全的。你担心什么是不安全的呢?你能举个例子吗? - Remy LebeauTRegEx
不是线程安全的,我认为。 - MaxMatch
上按 Ctrl 即可访问:RegEx.Match('')
。对于这个问题,我或许应该提一下我的 Delphi 版本:它是 10.2。 - MaxTRegEx
。 - Max