所以我有一个在不同线程上的其他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)));
}
}
}
会导致锁定问题吗?
答案 0 :(得分:3)
该代码不会导致任何线程安全问题,前提是您在其他线程枚举时不修改SafeRules
集合。
答案 1 :(得分:3)
这里的问题似乎是你在多个线程的单个Config::GetSafeRuleRegex
实例上调用Config
并且想知道这是否安全。
在这种情况下,yield return
没有任何固有的危险。每个调用GetSafeRuleRegex
的线程都将获得一个单独的迭代器实例。在多个线程上创建它们是安全的,前提是实例仅用于创建它的线程。
GetSafeRuleRegex
中的其他代码可能存在一些问题。但是,这取决于Config
的实施细节,这些问题并不清楚。