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

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

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

Re[2]: 並列スレッドの実行開始タイミングのズレ


(過去ログ 114 を表示中)

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

■67254 / inTopicNo.1)  並列スレッドの実行開始タイミングのズレ
  
□投稿者/ Tom (1回)-(2013/07/19(Fri) 11:29:29)

分類:[C#] 

以下の様なスレッドを並列に実行するコードを実行した場合、
自分の環境では5個のスレッドはすぐに開始されるのですが、6個め以降のスレッドが一秒ぐらいづつ遅れて実行されてしまいます。
自分の理想では10個全てのスレッドがすぐに実行されてほしいのですが…。
これはスレッドのどういった仕組みによる現象なのでしょうか?
また、何か解決策はあるのでしょうか?

static void Main(string[] args)
{
    Parallel.For(
        0, 10,
        i =>
        {
            Console.WriteLine("Thread " + i + " started");
            while (true)
            {
                Thread.Sleep(10);
            }
        });

    Console.ReadKey();
}

引用返信 編集キー/
■67256 / inTopicNo.2)  Re[1]: 並列スレッドの実行開始タイミングのズレ
□投稿者/ Honglian (1回)-(2013/07/19(Fri) 12:02:02)
http://msdn.microsoft.com/ja-jp/library/vstudio/system.threading.threadpool.aspx
スレッドプールの最低スレッド数制御によるものです。
・スレッドの起動はそれなりに時間が掛かる
・そのシステムが使えるコア数を超えて並行処理してもコンテキストスイッチなどでパフォーマンスが悪化する
などの理由により、何十ものスレッドを同時起動はしないように既定で設定されています。

ThreadPool.SetMinThreadsを使えば設定を変更できますが、プロセス全体に影響が及ぶためあまり推奨はできません。
カスタムのTaskSchedulerを作って、ThreadPoolとは別のスレッド管理を行う方法もあります。
引用返信 編集キー/
■67269 / inTopicNo.3)  Re[2]: 並列スレッドの実行開始タイミングのズレ
□投稿者/ Tom (2回)-(2013/07/19(Fri) 21:19:27)
素敵な回答有難うございます!
なるほど、ThreadPoolによるものだったのですね。
TaskSchedulerの自作は敷居が高そうなので、別の方法を試してみます。
どうもありがとうございましたm(_ _)m
解決済み
引用返信 編集キー/
■67270 / inTopicNo.4)  Re[2]: 並列スレッドの実行開始タイミングのズレ
□投稿者/ επιστημη (60回)-(2013/07/19(Fri) 21:21:30)
επιστημη さんの Web サイト
イベントで待ち合わせてみた。

using System;
using System.Threading;
using System.Threading.Tasks;

class Program {
  static  EventWaitHandle ewh;

  public static void Main() {
    const int N = 10;
    ewh = new EventWaitHandle(false, EventResetMode.ManualReset);
    Parallel.For(
        0, N+1,
        i =>
        {
          if ( i != N ) {
            Console.WriteLine("Thread " + i + " started (wait)");
            // 合図を待つ
            ewh.WaitOne();
            Console.WriteLine("Thread " + i + " started (resume)");
            while (true)
            {
                Thread.Sleep(10);
            }
          } else {
            // 最後の一つが号砲を鳴らす
            Console.WriteLine("--- GO! ---");
            ewh.Set();
          }
        });
    Console.ReadKey();
  }
}

引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -