2010-11-11 14 views
1

J'ai donc une instance commune d'une classe partagée entre 2 autres classes sur des threads différents. laissez-moi vous expliquer:Thread Sécurité de retour de rendement (est-ce?)

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))); 
     } 
    } 
} 

cela causera des problèmes de verrouillage?

+0

Qu'est-ce que this.SafeRules? Collection? Est-ce modifié? –

+0

Sans savoir ce que 'Item' fait avec' config' ou le reste de 'Config' il est impossible de dire si cela causera des" problèmes de verrouillage ". Quels sont les problèmes de verrouillage de toute façon? – MSN

+0

J'aurais dû dire les conditions de course. ma faute. @Aaron: Les règles de sécurité ne sont pas souvent modifiées, elles sont placées dans un fichier de configuration. Je suis novice dans le domaine du threading, je ne savais pas très bien stocker une liste de Regex et les utiliser, mais je dois m'assurer que l'utilisateur a passé une regex valide, afin que l'application ne soit pas explosée. –

Répondre

3

Il semble que la question ici est que vous appelez Config::GetSafeRuleRegex sur une seule instance Config à partir de plusieurs threads et vous vous demandez si cela est sûr.

Il n'y a rien de fondamentalement dangereux à propos de yield return dans ce scénario. Chaque thread qui appelle GetSafeRuleRegex obtiendra une instance d'itérateur distincte. Il est sûr de les créer sur plusieurs threads à condition que l'instance ne soit utilisée que sur le thread sur lequel elle a été créée.

Il peut y avoir quelques problèmes avec l'autre code dans GetSafeRuleRegex. Cependant, cela dépend des détails de mise en œuvre de Config qui ne sont pas claires à partir de ces questions.

+0

Merci! l'instance d'itérateur séparée était ce que je cherchais. Si je 'lock {}' les règles de sécurité pour éditer la collection, est-ce qu'elle casserait n'importe quel itérateur, ou est-ce que je devrais faire quelque chose ala 'this.SafeRules.ToArray()' avant que j'interrompe? –

3

Ce code ne causera pas de problèmes de sécurité de thread, à condition de ne pas modifier la collection SafeRules pendant que d'autres threads l'énumèrent.