收益率的线程安全性(是吗?)

时间:2010-11-11 18:12:06

标签: c# .net multithreading c#-4.0 thread-safety

所以我有一个在不同线程上的其他2个类之间共享的类的公共实例。让我解释一下:

public class Config
{
    public IEnumerable<Regex> GetSafeRuleRegex()
    {
        foreach (string rule in this.SafeRules)
        {
            Regex regex = null;

            try
            {
                regex = new Regex(rule, RegexOptions.IgnoreCase);
            }
            catch(Exception e)
            {
                Trace.Write(e.Message);
            }

            if (regex != null)
                yield return regex;
        }
    }
}

public class Dispatcher
{
    public void Start()
    {
        var config = new Config();

        for (var i = 0; i < 10; i++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(o => new Item(config)));
        }
    }
}

会导致锁定问题吗?

2 个答案:

答案 0 :(得分:3)

该代码不会导致任何线程安全问题,前提是您在其他线程枚举时不修改SafeRules集合。

答案 1 :(得分:3)

这里的问题似乎是你在多个线程的单个Config::GetSafeRuleRegex实例上调用Config并且想知道这是否安全。

在这种情况下,yield return没有任何固有的危险。每个调用GetSafeRuleRegex的线程都将获得一个单独的迭代器实例。在多个线程上创建它们是安全的,前提是实例仅用于创建它的线程。

GetSafeRuleRegex中的其他代码可能存在一些问题。但是,这取决于Config的实施细节,这些问题并不清楚。