Parallel.ForEach локальное хранилище - PullRequest
1 голос
/ 03 августа 2010

Недавно я изменил цикл For Each на цикл 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?

1 Ответ

4 голосов
/ 03 августа 2010

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

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(!)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...