私は周りを読んでいて、.Netでスレッドの代わりにタスクを使用すると、スレッドに問題があるコンテキストスイッチの影響を受けないことを読みました。
しかし、周りを読んで、タスクがとにかくカバーの下でスレッドを使用していることにも気づきました。
だから私は少し混乱しています、どんな説明でもありがたいです。
私は周りを読んでいて、.Netでスレッドの代わりにタスクを使用すると、スレッドに問題があるコンテキストスイッチの影響を受けないことを読みました。
しかし、周りを読んで、タスクがとにかくカバーの下でスレッドを使用していることにも気づきました。
だから私は少し混乱しています、どんな説明でもありがたいです。
あなたが読んだことは間違っています。
Task
TPLの一部です。TPLは、CLRのスレッドプールよりも高度なスケジューラを使用します。例として、TPLスケジューラーはを使用しWorkStealingQueues
ます。
いくつかの事実:
Task.Factory.StartNew
使用するか、使用するかにかかわらずThreadPool.QueueUserWorkItem
、両方が同じスレッドプールを使用します(.NET 4.0)Task
か「生の」スレッドを使用するかにかかわらず、タイムスライスごとにコンテキストスイッチが発生します。Task
は、通常のスレッドと同じ数のコンテキストスイッチを引き起こします。コンテキストスイッチは、スレッドを同時に処理するのに十分なプロセッサがない場合にのみ発生することに注意してください。
チェックアウトするためのいくつかのリンク:
TPLとスレッドプールの違い、および.NET 4.0でのスレッドプールの変更: http ://www.danielmoth.com/Blog/New-And-Improved-CLR-4-Thread-Pool-Engine.aspx
C#でWorkStealingQueueを実装する方法を示します: http ://www.bluebytesoftware.com/blog/2008/08/12/BuildingACustomThreadPoolSeriesPart2AWorkStealingQueue.aspx
ダニエルモスのブログ投稿の短いバージョン:http: //blogs.msdn.com/b/jennifer/archive/2009/06/26/work-stealing-in-net-4-0.aspx
コンテキストスイッチはスレッドに固有のものではなく、スレッドの誤用に固有のものです。タスクは、実行中のスレッドが実行する必要のあるタスクを実行できるようにスレッドを使用し、スレッドが誤用されたときに発生するコストのかかるコンテキストスイッチを回避します。