Поток Безопасность возврата урожая (не так ли?) - PullRequest
1 голос
/ 11 ноября 2010

Итак, у меня есть общий экземпляр класса, который используется двумя другими классами в разных потоках. позвольте мне объяснить:

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 ]

3 голосов
/ 11 ноября 2010

Похоже, вопрос здесь в том, что вы вызываете Config::GetSafeRuleRegex для одного Config экземпляра из нескольких потоков и задаетесь вопросом, безопасно ли это.

В этом сценарии нет ничего опасного в yield return. Каждый поток, который вызывает GetSafeRuleRegex, получит отдельный экземпляр итератора. Безопасно создавать их в нескольких потоках, если экземпляр используется только в том потоке, в котором он создан.

Могут быть проблемы с другим кодом в GetSafeRuleRegex. Однако это зависит от деталей реализации Config, которые не ясны из этого вопроса.

3 голосов
/ 11 ноября 2010

Этот код не вызовет проблем с безопасностью потоков, если вы не измените коллекцию SafeRules, пока другие потоки ее перечисляют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...