是正则表达式实例线程安全的在C#中的比赛(Is Regex instance thread safe

2019-08-02 02:52发布

我有这样的正则表达式我使用的这Parallel.ForEach<string> 。 安全吗?

Regex reg = new Regex(SomeRegexStringWith2Groups);
Parallel.ForEach<string>(MyStrings.ToArray(), (str) =>
{
    foreach (Match match in reg.Matches(str)) //is this safe?
        lock (dict) if (!dict.ContainsKey(match.Groups[1].Value))
            dict.Add(match.Groups[1].Value, match.Groups[2].Value);
});

Answer 1:

Regex对象是只读的,因此是线程安全的。 这是他们返回时, Match对象可能会出现问题。 MSDN证实了这一点 :

正则表达式类本身是线程安全的,不可变的(只读)。 也就是说,正则表达式的对象可以在任何线程被创建和线程之间共享; 匹配方法可以从任何线程调用,从来没有改变任何全局状态。

然而正则表达式返回的结果对象(匹配和MatchCollection)应该在单个线程中使用..

我很关心如何以这样的方式,可能是并发的,这可能导致收集行动有点奇怪产生的匹配收集。 有些比赛实现使用延迟的评价,这可能导致在一些疯狂行为foreach循环。 我可能会收集所有的比赛,再后来对其进行评估,既要安全,并获得一致的性能。



文章来源: Is Regex instance thread safe for matches in C#