次の 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