【发布时间】:2013-11-11 11:38:48
【问题描述】:
我有以下 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
【问题讨论】:
-
CalcSomething 里面的代码在这里很重要。例如,我们需要知道它是否正在访问任何状态。
-
恐怕代码太具体了,没人愿意费心去理解。我将编辑我的主要帖子并添加一些有关它的信息
标签: .net vb.net parallel.foreach