none
マルチスレッド RRS feed

  • 質問

  • 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;
    などを書かずしてもやりたいことができるコードの記述はどのようなものになるでしょうか?

    よろしくお願いいたします。

    2009年11月23日 6:10

回答

  • メインのループ(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
    2009年11月23日 8:06

すべての返信

  • メインのループ(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
    2009年11月23日 8:06
  • 佐祐理様,度々のご回答ありがとうございます。

    >>メインのループ(kやAA)とB1、B2との間に依存関係・引数の受け渡しなどがあるのか気になります。
    メインループ、B1、B2それぞれ依存、引数の受け渡しはありません。

    教えて頂いたコード早速実装してみます。
    大変に参考になりました、ありがとうございます。
    2009年11月24日 7:52
  • 依存関係がないのなら

    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()していけばいいのではないでしょうか。
    2009年11月24日 8:34