2017-11-27 5 views
-1

私は次の行に出くわしたとき、私は、コリン・キャンベルによる並列プログラミングの本を読んでいた。サブタスク

タスクファクトリメソッドのいずれかがスレッド プールのワーカースレッド内から呼び出されると、デフォルトタスクスケジューラは、新しいタスクをそのスレッドのローカルタスクキュー に配置します。これは、 よりも高速な操作で、グローバルキューに配置されます。

いつでもタスクを作成します。私は、段落の上から推定何

は、私はそれがさらに帳に書かれたように、すべてのタスクが同じワーカースレッドで実行されます、次の思考をコード化他のタスクの中から、または スレッドプールの作業項目内で、あなたには、いくつかの大きな計算

 Task.Factory.StartNew(() => 
     { 
      Thread.Sleep(1000); 
      Console.WriteLine("Task Id for A task: {0}", Thread.CurrentThread.ManagedThreadId); 

      // subtasks within Global Task 
      var t2 = Task.Factory.StartNew(() => { Thread.Sleep(500); Console.WriteLine("Task Id for B task : {0}", Thread.CurrentThread.ManagedThreadId); }); 
      var t3 = Task.Factory.StartNew(() => { Thread.Sleep(1000); Console.WriteLine("Task Id for C task: {0}", Thread.CurrentThread.ManagedThreadId); }); 
      var t4 = Task.Factory.StartNew(() => { Thread.Sleep(2000); Console.WriteLine("Task Id for D task: {0}", Thread.CurrentThread.ManagedThreadId); }); 

      Task.WaitAll(t2, t3, t4); 
     }); 
の一部である動作を実行しているから

しかし、私の予想に反して、その結果は、ASが判明:

結果:4:Dタスクの2
タスクID:Bタスクの1
タスクID:タスクの

タスクID 3

期待:Cタスクの
タスクID

タスクID tについて頼む:1
タスクIDをBのタスクのために:1
タスクIDをDタスクのために:1
タスクIDをCタスクのために:1

は私の直感が私を誤解を招くように思えます!どこでトラックを失ったのですか?

+1

あなたは仕事を盗むことを忘れました。最初の引用と同じセクションにある可能性があります。あなたが睡眠とWaitAllを取り除くと、どんな結果が得られますか?また、タスクId!=スレッドIDあなたはスレッドの共有を見るために間違った値をチェックしています。 –

答えて

1

あなたは仕事を盗むことを忘れました。あなたの最初の引用と同じセクションにある可能性があります。あなたが睡眠とWaitAllを取り除くと、どんな結果が得られますか?また、タスクId!=スレッドIDあなたはスレッドの共有を見るために間違った値をチェックしています。

関連する問題