我有以下 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
whereglbObject
是一个全局对象,一个SharedObject
类的实例,函数CalcSomething
获取TagObj ByRef
并修改这个对象。安全吗?
关于做什么CalcSomething
:
- 它遍历所有标签的列表(即 a
_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