Existe-t-il une condition de concurrence possible en dessous du code?Condition de course dans 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);
});
}
Cela dépendra de la façon dont vous implémentez 'GetOutputData', puisque c'est la méthode qui alloue ou réutilise les objets existants. Le fait que 'objData' soit déclaré en dehors de' ForEach' ne signifie pas en soi qu'il y a un risque qu'un thread lit l'objet d'un autre thread. –
@PaulHicks: Vous avez décrit le problème assez précisément, en plus de nier que c'est un problème. Le fait que 'objData' soit déclaré en dehors du lambda signifie qu'il s'agit d'une capture, et toutes les instances du lambda partageront une seule variable. Alors oui, il y a certainement un risque qu'un thread lit l'objet d'un autre thread. –