我有一个类有许多属性是Integer
和Single
。我想以多线程的方式使用这个类,使得这些属性可以用作累加器(该类是报告方案的基础)。所以,我希望能够做这样的事情:线程安全属性
Public Class ReportTotals
Property Count As Integer
Property Total As Single
Property Tax As Single
Property Shipping As Single
Property ItemsSold As Integer
Public Function GetReport() As String
...
End Function
End Class
Public Function BuildReportData As ReportTotals
Dim myReport As New ReportTotals
With myReport
Parallel.ForEach(UserSales, Sub(userSale)
.Count += 1
.Total += userSale.Total
.Tax += userSale.Tax
.Shipping += userSale.Shipping
.ItemsSold += userSale.ItemsSold
'more complicated stuff and property assignments
End Sub)
End With
End Function
根据我的研究,我知道Integer
和Single
是原子,但我不知道这延伸到是一类的整数部分。我不想假设,因为多线程的bug可能会在稍后出现并咬我。
更新:显然,Single
是不是线程安全的,所以我必须使用该锁定,但Integer
?
整数分配是原子,但'.Count + = 1'不是。 'Interlocked.Increment'可以执行一个原子操作,但是如果你想确保两个增量操作是原子的,你可以使用'Lock' – I4V 2013-04-22 20:52:44
你的代码看起来并不会从并行化中获得太多收益(假设它是你的真实代码) 。如果每次迭代都这么简单,我认为并行版本可能会因开销而实际上变慢。 – svick 2013-04-22 21:27:58
每次迭代都不简单。在每次迭代中都有几个LINQ语句和数学处理发生。我只是在做上述事情时注册了近50%的速度(当然,这不包括线程安全性)。 – cjbarth 2013-04-22 21:50:12