分類:[.NET 全般]
2017/11/30(Thu) 09:52:46 編集(投稿者)
マルチスレッドで同じ変数に対して
アクセスする場合には、SyncLockによる同期が必要なのは知っていたのですが、
配列の場合にもこれは必要なのでしょうか?
例えば、以下のコードを走らせてみると、
sumには1000000の3/5程度の
600000〜7000000程度の値が代入されます。
一方で、SyncLock ready_diffのコメントアウトを外すと
1000000の値が代入されます。
aaaという変数に同時に+1しようとすると+2ではなく+1しか足し算されないというのは理解できますが
qwe(3,5,6)とqwe(8,8,8)など同じ配列であっても
違う要素に足し算するのであれば、
同時に実行できるのではないかとおもっていたのですが
これはできないのでしょうか?
同期を有りにすると、著しく計算速度が遅くなるので
避けたいのですが、これは仕方のないことなのでしょうか?
Dim qwe(255, 255, 255) As Integer
Parallel.For(2, 1000000,
Sub(i)
' SyncLock ready_diff
Dim cRandom As New System.Random()
Dim x = cRandom.Next(1, 255)
Dim y = cRandom.Next(1, 255)
Dim z = cRandom.Next(1, 255)
qwe(x, y, z) += 1
' End SyncLock
End Sub)
Dim sum As Long = 0
For x = 1 To 255
For y = 1 To 255
For z = 1 To 255
sum += qwe(x, y, z)
Next
Next
Next