1

次の vb.net コードがありますが、ここで競合状態が発生するかどうかはわかりません。

私のテストでは、競合状態の証拠は見られませんでした。

Public Class Worker
    Private _List As New List(Of clsTag)
    ' assume that we added tag objects to list defined above ....
    Public Sub Main()
        Dim tagCol As IEnumerable = _List 
        Parallel.ForEach(tagCol.Cast(Of Object)(), Sub(TagObj As clsTag)
            TagObj.CheckLogicValue()
        End Sub)
    End Sub
End Class

Public Class clsTag 
    Public Sub CheckLogicValue()
        ...
        glbObject.CalcSomething(Me)
        ...
    End Sub
End Class

Public Class SharedObject
    Public Function CalcSomething(ByRef objTag As clsTag) As Decimal
        ' Do some calculation based on objTag and also modify objTag status here!
    End Function
End Class

はグローバルglbObjectオブジェクトであり、SharedObjectクラスのインスタンスであり、関数はこのオブジェクトをCalcSomething取得しTagObj ByRefて変更します。安全ですか?

何をするかについてCalcSomething

  • すべてのタグ ( ) のリストを_List調べて、そこから読み取ります (変更は行いません)。
  • リストで見つかったものに基づいて、いくつかの式が計算されています。この式は、タグ オブジェクトもリストも変更しません。

計算結果 (関数が返すものでもあります) に基づいて、tagObject渡された のフィールドByRefが更新されているため、次のようになります。

Public Class SharedObject
     Public Function CalcSomething(ByRef objTag As clsTag) As Decimal
         ' Do some calculation based on objTag and also modify objTag status here!
         if (...) then
             objTag.ItemBroken = False
         EndIf
     End Function
End Class
4

1 に答える 1