Я вызываю подпрограмму MyPartsMatrix внутри вложенных циклов Parallel.For (vb.net). MyPartsMatrix требуется переменная с именем «unfilled», которая передается ByRef, поскольку это значение изменяется внутри подпрограммы MyPartsMatrix. Мне нужно получить и сохранить это значение после выполнения подпрограммы MyPartsMatrix.
«Незаполненная» переменная дает другое значение, когда я запускаю параллельную версию этого кода по сравнению с непараллельной версией, использующей обычные вложенные циклы For...Next. Я не могу понять, почему это так.
Является ли потокобезопасным вызов другой подпрограммы из цикла Parallel.For?
Является ли эта переменная «незаполненной» потокобезопасной?
Dim ConcurrentListofResults As ConcurrentQueue(Of FindBestResults)
ConcurrentListofResults = New ConcurrentQueue(Of FindBestResults)
Dim x = 5, y = 5
Parallel.For(0, x, Sub(oD)
Parallel.For(0, y, Sub(oT)
Dim unfilled As Integer = 0
MyPartsMatrix (oD, oT, unfilled)
'Create a FBS item to add to the concurrent list collection
Dim FBSResultsItem = New FindBestResults
FBSResultsItem.oD = oD
FBSResultsItem.oT = oT
FBSResultsItem.unfilled = unfilled
'Add this item to the Concurent collection
ConcurrentListofResults.Enqueue(FBSResultsItem)
End Sub)
End Sub)
'Get best result.
Dim bestResult As FindBestResults
For Each item As FindBestResults In ConcurrentListofResults
If item.unfilled < bestResult.unfilled Then
bestResult.oD = item.oD
bestResult.oT = item.oT
bestResult.unfilled = item.unfilled
End If
Next
Public Sub MyPartsMatrix (ByVal oD As Integer, ByVal oT As Integer, ByRef unfilled As Integer)
'....do stuff with the unfilled variable....
'unfilled is a counter that is incremented while we run through the PartsMatrix
unfilled = unfilled + 1
End Sub
Если это не потокобезопасно, есть ли другой способ написать это, чтобы «незаполненная» переменная была потокобезопасной или чтобы сделать вызов другого потока подпрограммы безопасным?