トップ回答者
マルチスレッド

質問
-
C#初心者です。御教授お願いします。マルチスレッドに関して質問です。
以下のコードで
Thread[] threads = new Thread[2];
for (k = 0; k < 99; k++)
{
AA
//マルチスレッド
threads[0] = new Thread(new ThreadStart(B1));
threads[0].IsBackground = true;
threads[0].Start();
threads[1] = new Thread(new ThreadStart(B2));
threads[1].IsBackground = true;
threads[1].Start();
threads[0].Join();
threads[1].Join();
}
(AA,B1,B2はコード)
やりたいことは
1,AAという処理を行う
2,AA処理後、B1,B2をマルチスレッドとして並列処理
3,B1B2の処理が共に終了後、kをインクリメントして再びAAを処理
...
このような操作をしたいとき、上のコードで正しいですか?
また、kのループ内に
threads[0] = new Thread(new ThreadStart(B1));
threads[0].IsBackground = true;
などを書かずしてもやりたいことができるコードの記述はどのようなものになるでしょうか?
よろしくお願いいたします。
回答
-
メインのループ(kやAA)とB1、B2との間に依存関係・引数の受け渡しなどがあるのか気になります。
var b1 = new ThreadStart( B1 );
var b2 = new ThreadStart( B2 );
for( k = 0; k < 99; k++ ){
AA
var ar1 = b1.BeginInvoke( null, null );
var ar2 = b2.BeginInvoke( null, null );
b1.EndInvoke( ar1 );
b2.EndInvoke( ar2 );
}
これはスレッドとは少し違う非同期実行を利用した例です。同期メソッドの非同期呼び出し に説明があります。本来はdelegateを宣言する必要があるのですが、ThreadStartデリゲートを流用しています。
非同期実行は本来、短い処理を多数実行させるためのものですので、あまり長時間かかる処理はさせるべきではありません。が、今回は2スレッドと少数・限定的でしたので、使用して問題ないかなと思います。- 回答としてマーク kenkou_t 2009年11月24日 7:49
すべての返信
-
メインのループ(kやAA)とB1、B2との間に依存関係・引数の受け渡しなどがあるのか気になります。
var b1 = new ThreadStart( B1 );
var b2 = new ThreadStart( B2 );
for( k = 0; k < 99; k++ ){
AA
var ar1 = b1.BeginInvoke( null, null );
var ar2 = b2.BeginInvoke( null, null );
b1.EndInvoke( ar1 );
b2.EndInvoke( ar2 );
}
これはスレッドとは少し違う非同期実行を利用した例です。同期メソッドの非同期呼び出し に説明があります。本来はdelegateを宣言する必要があるのですが、ThreadStartデリゲートを流用しています。
非同期実行は本来、短い処理を多数実行させるためのものですので、あまり長時間かかる処理はさせるべきではありません。が、今回は2スレッドと少数・限定的でしたので、使用して問題ないかなと思います。- 回答としてマーク kenkou_t 2009年11月24日 7:49
-
依存関係がないのなら
var threads = new List<Thread>();
var b1 = new ThreadStart( B1 );
var b2 = new ThreadStart( B2 );
for( k = 0; k < 99; k++ ){
AA
var thread = new Thread( b1 );
thread.Start();
threads.Add( thread );
thread = new Thread( b2 );
thread.Start();
threads.Add( thread );
}
foreach( var thread in threads )
thread.Join();
一通り起動してしまって、後からJoin()していけばいいのではないでしょうか。