同様の質問がhereと尋ねられましたが、一般的にすべての回答がラムダ表記に関連しているようです。私は、私はいくつかの明確化を求めるだろうと思ってラムダせずに同様の結果を得る:スレッドスタートアップの競合条件
は、私がこのような何かを持っていると言う:
for (int i = 0; i < 5; i++)
(new Thread(new ThreadStart(delegate()
{
Console.WriteLine("Thread " + i);
}))).Start();
一つは、次の出力期待:
Thread 0
Thread 1
Thread 2
Thread 3
Thread 4
を
今、私はスレッドが特定の順序で開始されていないことを認識していますので、上記の行が任意の順序で出てくると仮定しましょう。
しかし、それはどういうことではありません。
Thread 3
Thread 4
Thread 4
Thread 4
Thread 4
または類似のものではなく、私は、それが参照を渡している場合は、値を渡すよりも、それを信じるために私を導く:代わりに何が起こる 。 (int型は値型なので変です)。このような何か行う
:
for (int i = 0; i < 5; i++)
(new Thread(new ThreadStart(delegate()
{
int j = i;
Console.WriteLine("Thread " + j);
}))).Start();
は私達が私のコピーを行っているにもかかわらず、いずれか助けていません。私はその理由が、私が時間の中で私のコピーを作っていないと仮定しています。このような
こう何か:
for (int i = 0; i < 5; i++)
{
(new Thread(new ThreadStart(delegate()
{
Console.WriteLine("Thread " + i);
}))).Start();
Thread.Sleep(50);
}
たちは各反復では50msを無駄にしているようしかし、それは事実に言及していない、非常に望ましくない、問題を解決するようコンピュータが重く、その後にロードされた場合にはたぶん50msで十分ではないかもしれません。ここで
は私の現在、特定の問題のサンプルです:
Thread t = new Thread(new ThreadStart(delgate()
{
threadLogic(param1, param2, param3, param4);
}));
t.Start();
param1 = param2 = param3 = param4 = null;
で:
void threadLogic(object param1, object param2, object param3, object param4)
{
// Do some stuff here...
}
私はthreadLogic()は独自のスレッドで実行したい、しかし、上記のコードは、NULLを与えます参照例外。これは、スレッドが起動する機会が来る前に値がnullに設定されているためと考えられます。
もう一度、Thread.Sleep(100)を入れても、それはあらゆる面から非常に難解です。 この種の競合状態にはどんな人がおすすめですか?
はhttp://stackoverflow.com/questions/1930133/c-closures-why-is-the-loopvariable-captured-by-referenceを参照してください、とhttp://stackoverflow.com/質問/ 1923577/differenting-behavior-starting-a-thread-parameterizedthreadstart-vs-anonymous/ – nos