我有一個類有許多屬性是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