2010-08-03 3 views
1

Недавно я изменил a Для каждого цикла в цикл Parallel.ForEach. Я обеспокоен тем, что объект объявляется вне цикла, но назначается при повторении в цикле. Вот упрощенный код.Parallel.ForEach локальное хранилище

Dim results As ModelResults 
Dim noResultsModel As New List(Of ModelResults) 
Dim lock As New Object 
Parallel.ForEach(_modelEngines, 
    Sub(model) 

    results = model.Execute 

    If results IsNot Nothing Then 

     SyncLock lock 
      noResultsModel.Add(results) 
     End SyncLock 

    End If 

    results = Nothing 

End Sub) 

Есть ли потенциальное состояние гонки с объектом результатов? Было бы все иначе, если бы я переместил объявление результатов в цикл for?

ответ

4

Да, определенно есть состояние гонки с переменной, объявленной вне цикла:

Thread 1: results = model.Execute ' results are from Thread1's current modelEngine 
Thread 2: results = model.Execute ' results are from Thread2's current modelEngine 
Thread 2: If results IsNot Nothing Then ' results are from Thread2's current modelEngine 
Thread 1: If results IsNot Nothing Then ' results are from Thread2's current modelEngine(!) 

Просто переместите его внутрь, я не понимаю, почему вы хотели бы объявить его вне цикла в любом случае.

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