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

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

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

マルチスレッド処理で1から順番に実行する方法

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■91382 / inTopicNo.1)  マルチスレッド処理で1から順番に実行する方法
  
□投稿者/ バンク (1回)-(2019/06/19(Wed) 22:20:52)

分類:[.NET 全般] 

以下のようにして
Forループをマルチスレッドで並列処理することができます。

Parallel.For(1, Num + 1,
Sub(i As Integer)

End)

しかし、この方法だとiは順番ではなく
ランダムな順番の数値が使用されてしまいます。

これを1から順番に実行されるようにしたいのですが
どのようにすれば良いですか?

一つの方法は
Dim s as integer = 0

Parallel.For(1, Num + 1,
Sub(i As Integer)

SyncLock aaa

s += 1

End SyncLock

End)

のようにして、同時アクセスできない領域にカウント変数のカウントアップを行うことです。

この方法ならうまくいくのですが、
計算時間を比較したところ、
完全に非同期の場合と比べて計算時間が長くなってしまいます。

何とか計算速度を落とさずに、
マルチスレッド処理できる方法はないでしょうか?




引用返信 編集キー/
■91383 / inTopicNo.2)  Re[1]: マルチスレッド処理で1から順番に実行する方法
□投稿者/ Azulean (1070回)-(2019/06/19(Wed) 22:47:58)
No91382 (バンク さん) に返信
> 何とか計算速度を落とさずに、
> マルチスレッド処理できる方法はないでしょうか?

順番保証するためには何らかの同期(ロック)が必要であり、ノーコストで Parallel 相当の動作は実現できないように思えます。

たとえば、3 つのスレッドに A,B,C にそれぞれ (1,4,7),(2,5,8),(3,6,9) と割り振ったとしても、A,B,C の順番に次に続くことが保証されていませんので、1,2,3,4,... といくこともあれば、1,3,2,5,... といったように進むこともあり得ます。
このため、順番を保証して実行するためには、ゼロにはできない同期コストがかかります。

ゆえに、ロックによるペナルティを受け入れてでも順番に実行するか、スピードを優先して順番通りでなくても構わないようにするかを選ぶ必要があるでしょう。

-----

ところで、なぜ順番に実行されないと困るのですか?
結果を画面に表示するときに並べ替えるなど、多くの場合、代替案があるように思うためです。
引用返信 編集キー/
■91384 / inTopicNo.3)  Re[1]: マルチスレッド処理で1から順番に実行する方法
□投稿者/ kiku (95回)-(2019/06/20(Thu) 09:09:17)
No91382 (バンク さん) に返信

下記のように計算ロジックが引数iのみに依存しているのであるならば、
そのとき計算に利用した引数iと結果をリストに持っておいて、
全部計算が終わったところで、引数iの順番で結果を並べればよいのではないかと
思いました。

・計算ロジック(引数iのみに依存)
 結果=引数i*2

計算ロジックが何に依存しているかによって
対処案が変わってくると思います。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ