C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■85877 / )  マルチスレッドで配列でも同期が必要ですか?
□投稿者/ コング (1回)-(2017/11/30(Thu) 09:52:14)

分類:[.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


返信 編集キー/


管理者用

- Child Tree -