スレッドに関するいくつかのことを読み、複数のスレッドによってアクセスされている変数をロックする必要があることを知っています。私が経験している問題はMainQueueToWorkingQueue(x)
、最初にスレッドを割り当ててスレッドを開始し、次に 2 番目の for ループで start を呼び出すと、値が常に 3 になることです。
しかし、これを行うnew Thread(() => MainQueueToWorkingQueue(x)).Start();
と、コードは期待どおりに実行され、正しい番号が渡されます。
private static List<BlockingQueue> WorkingQueueList = new List<BlockingQueue>();
static void Main(string[] args)
{
for(Int32 WorkingQueueListInsers = 0; WorkingQueueListInsert < 3; WorkinfQueueListInsert++)
{
WorkingQueueList.Add(new BlockingQueue(20));
}
Thread[] MainThreads = new Thread[WorkingQueueList.Count];
for (Int32 x = 0; x < WorkingQueueList.Count; x++)
{
/* MainThreads[x] = */ new Thread(() => MainQueueToWorkingQueue(x)).Start();
Thread.Sleep(50);
}
for (Int32 x = 0; x < WorkingQueueList.Count; x++)
{
MainThreads[x].Start();
Thread.Sleep(50);
}
Console.Read();
}
private static void MainQueueToWorkingQueue(Int32 WorkingQueuePosition)
{
/* if new Thread(() => MainQueueToWorkingQueue(x)).Start(); is called
then WorkingQueuePosition is correct and is either zero, one, or two. */
/* if the thread is allocated in one for loop, then started in another for loop, WorkingQueuePosition only equals three */
Console.WriteLine("Ending x: " + WorkingQueuePosition);
while (true)
{
WorkingQueueList[WorkingQueuePosition].Enqueue(MainQueue.Dequeue());
}
}
私の質問はこれです。新しいスレッドを作成するときに使用すると、渡されたパラメーターが正しいのに、2 番目の for ループでStart()
呼び出すと、渡されたパラメーターが常に 3 になるのはなぜですか?Start()
私の推測: どこかでパラメータが変更されていることを知っています。私の最初の推測では、 x の更新が速すぎたため、スレッドが渡された値とは異なる値を使用したためにループが高速に実行されていたということでした。私はそれを修正しようとしましたThread.Sleep(50)
が、問題はまだ残っていました。
編集:問題を直接処理していないコードを取り出しました。