2016-11-07 8 views
4

私は(私はちょうど楽しみのために学んでいる)C#でマルチスレッドに苦労し、私はおそらくスレッドが何であるかを理解していない実現しています!以下のコードを実行すると、次のような出力が得られることを期待していました。ThreadLocal <T> - スレッドとは何ですか? (C#)

T1: 11 
T2: 11 
T3: 11 
T4: 11 
T5: 11 
T6: 11 

(おそらく異なる順序で)

しかし、私は

T1: 11 
T2: 11 
T3: 12 
T5: 12 
T6: 13 
T4: 11 

のようなものを得ている私は、各タスク(T6へのT1)は新しいスレッドであろうと想定していたし、したがって、「ローカル」の各インスタンスは10に初期化され、1だけインクリメントされます。しかし、これは起こっているようには見えません。誰が何が起こっているのか、私が間違って推測していることを誰でも説明できれば、とても感謝しています。 (私はから開始するのに十分な基本的な何かを見つけることができませんので、私はそれが困難なスレッドとグリップに来て見つけることだ認めなければならない!)

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

namespace TestThreads 
{ 

    class TestThreadLocal 
    { 

     static void Main() 
     { 
      ThreadLocal<int> local = new ThreadLocal<int>(() => 
      { return 10; 
      }); 

      Task t1 = Task.Run(() => 
      { local.Value++; 
       Console.WriteLine("T1: " + local.Value); 
      }); 

      Task t2 = Task.Run(() => 
      { local.Value++; 
       Console.WriteLine("T2: " + local.Value); 
      }); 
      Task t3 = Task.Run(() => 
      { local.Value++; 
       Console.WriteLine("T3: " + local.Value); 
      }); 

      Task t4 = Task.Run(() => 
      { local.Value++; 
       Console.WriteLine("T4: " + local.Value); 
      }); 

      Task t5 = Task.Run(() => 
      { local.Value++; 
       Console.WriteLine("T5: " + local.Value); 
      }); 

      Task t6 = Task.Run(() => 
      { local.Value++; 
       Console.WriteLine("T6: " + local.Value); 
      }); 

      Task.WaitAll(t1, t2, t3, t4, t5, t6); 
      local.Dispose(); 
     } 
    } 
} 
+9

タスク!=スレッド。タスクの主なポイントの一つは、彼らが –

+3

私の推測を実行する方法の詳細をスレッドに関する部分まで作業単位をと*気にしない*にある 'Task.Run'が** **スレッドプールを使用しているため、いくつかのタスクが上で実行されていることですこのスレッドが前のタスクを完了することができた場合、同じスレッド –

+2

https://msdn.microsoft.com/en-us/library/dn906268(v=vs.110).aspx –

答えて

3

理由はTask.Runは、それがつかむ意味スレッドプールを使用しています既存のスレッドのプールからいくつかの無料のスレッドが、それに動作しませんし、それが戻っ(簡易的に)戻ります。したがって、1つ以上の後続のTas.Run操作が同じスレッドで実行される可能性は完全にあります。これを確認する最も簡単な方法は、現在のスレッドIDを印刷することです。

Task.Run(() => { 
    local.Value++; 
    Console.WriteLine("Thread id: {0}, value: {1}", Thread.CurrentThread.ManagedThreadId, local.Value); 
} 
+0

ありがとうございましたEvk - 完璧な意味合いがあり、はっきり説明されています。それはまさに私が知る必要があったものです。スレッドIDを追加することについてのヒントもありがとうございます。 – HedgePig

関連する問題