2014-10-22 2 views
2

Являются ли экземпляры Employee and/or Illness безопасными в этом сценарии? У каждого потока есть собственная копия объектов? Первоначально я думал, что каждый поток будет иметь свою собственную копию, но теперь я не уверен.Parallel.ForEach - безопасность потоков с вложенными экземплярами объектов

Parallel.ForEach(line01s, _options, o => 
{ 
    var employee = new Employee(); 
    // set values on employee...Safe? 

    var illness = new Illness(); 
    // set values on illness...Safe? 

    employee.AddIllness(illness); // Illness is a property on Employee 

} 

Возможно ли, чтобы объект Illness был установлен на неправильном объекте Сотрудника? Нужно ли добавить замок вокруг employee.AddIllness (болезнь);? Чем больше я работаю с этим материалом TPL, тем больше я нахожу, что не понимаю

ответ

7

Ваш пример работает только с объектами, создаваемыми внутри области лямбда-выражения, поэтому вам не о чем беспокоиться. Если вы изменяли состояние объекта за пределами лямбда-блока, тогда вам нужно будет беспокоиться о блокировке и т. Д.

+0

Предположим, я модифицирую состояние класса болезни в методе employee.AddIllness (болезнь). Нужно ли мне блокировать внутри этого метода? –

+0

@BigDaddy - Нет. Вы по-прежнему будете изменять только один экземпляр из единственной лямбды. Блокировка необходима только в том случае, если вы изменяете общее состояние из нескольких потоков. –

2

Если вы перечислили Parallel.ForEach над коллекцией сотрудников или создали нового сотрудника внутри лямбды, то есть Не о чем беспокоиться. Каждый лямбда-вызов полностью не зависит от других (если нет внешних переменных в closure).

Если коллектив сотрудников имеет дубликаты или обработка сложнее, тогда вам придется использовать некоторые synchronization code.

Смежные вопросы