私は(私はちょうど楽しみのために学んでいる)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();
}
}
}
タスク!=スレッド。タスクの主なポイントの一つは、彼らが –
私の推測を実行する方法の詳細をスレッドに関する部分まで作業単位をと*気にしない*にある 'Task.Run'が** **スレッドプールを使用しているため、いくつかのタスクが上で実行されていることですこのスレッドが前のタスクを完了することができた場合、同じスレッド –
https://msdn.microsoft.com/en-us/library/dn906268(v=vs.110).aspx –