Gibt es eine mögliche Wettlaufsituation im unteren Code?Race Zustand in 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);
});
}
Das hängt, wie Sie bei der Implementierung abhängen 'GetOutputData', da dies die Methode ist, die vorhandene Objekte zuweist oder wiederverwendet. Die Tatsache, dass 'objData' außerhalb von' ForEach' deklariert wird, bedeutet nicht, dass das Risiko besteht, dass ein Thread das Objekt eines anderen Threads liest. –
@PaulHicks: Sie haben das Problem ziemlich genau beschrieben, abgesehen davon, dass es ein Problem ist. Die Tatsache, dass 'objData' außerhalb des Lambda angegeben wird, bedeutet, dass es sich um ein Capture handelt, und alle Instanzen des Lambda teilen sich eine einzelne Variable. Es besteht also die Gefahr, dass ein Thread das Objekt eines anderen Threads liest. –