Возможно ли возможное состояние гонки в нижнем коде?Состояние гонки в Parallel.ForEach?
public void Process(List<SomeObject> list)
{
SomeDataOutput objData=null;
ConcurrentBag<SomeDataOutput> cbOutput = new ConcurrentBag<SomeDataOutput>();
ParallelOptions po = new ParallelOptions(){MaxDegreeOfParallelism=4};
Parallel.ForEach(list, po, (objInput) =>
{
objData = GetOutputData(objInput);//THIS LINE IS THE ONE I AM UNSURE OF. CAN objData GET OVERWRITTEN BY MULTIPLE PARALLEL THREADS?
cbOutput.Add(objData);
});
}
Это будет зависеть от того, как вы реализуете 'GetOutputData', поскольку это метод, который выделяет или повторно использует существующие объекты. Тот факт, что 'objData' объявлен вне' ForEach', сам по себе не означает, что существует риск одного потока, читающего объект другого потока. –
@PaulHicks: Вы довольно точно описали проблему, не отрицая, что это проблема. Тот факт, что 'objData' объявлен за пределами лямбда, означает, что он является захватом, и все экземпляры лямбда будут иметь одну переменную. Так что да, конечно, существует риск одного потока, читающего объект другого потока. –