2010-11-11 219 views
1

所以我必須在不同的線程等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

什麼是this.SafeRules?採集?它被修改了嗎? – 2010-11-11 18:17:10

+0

不知道什麼'Item'確實有'config'或Config'的'其他人來說是不可能告訴這是否會引起「鎖定問題」。無論如何,鎖定問題是什麼? – MSN 2010-11-11 18:19:57

+0

我應該說比賽條件。我的錯。 @Aaron:安全規則不會經常修改,他們坐在配置文件中。我是線程新手,所以我不確定如何存儲正則表達式列表並使用它們,但我需要確保用戶傳入了有效的正則表達式,所以應用程序不會崩潰。 – 2010-11-12 14:50:23

回答

3

看來這裏的問題是,你打電話給Config::GetSafeRuleRegex來自多個線程的單個Config實例,並且想知道這是否安全。

在這種情況下,yield return沒有什麼固有的危險。每個調用GetSafeRuleRegex的線程都將獲得一個單獨的迭代器實例。在多線程上創建它們是安全的,只要該實例僅在其創建的線程上使用。

GetSafeRuleRegex中的其他代碼可能存在一些問題。但是,這取決於Config的實現細節,這些問題並不清楚。

+0

謝謝!單獨的迭代器實例是我正在尋找的。如果我被鎖{}'安全規則編輯的最愛,它會打破任何迭代器,或將我需要做一些鼻翼'this.SafeRules.ToArray()'我以前迭代? – 2010-11-12 14:56:26

3

該代碼不會導致任何線程安全問題,前提是在其他線程正在枚舉時不修改SafeRules集合。