我已经阅读了一些关于线程的东西,并且知道我应该锁定一个被多个线程访问的变量。我遇到的问题是,MainQueueToWorkingQueue(x)
如果我通过首先分配线程来启动线程,然后在第二个 for 循环中调用 start,则 in 的值始终为 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());
}
}
我的问题是这个。为什么新建线程的时候传的参数是正确的,但是第二个for循环Start()
调用的时候传的参数总是3 ?Start()
我的猜测:我知道某处参数正在被更改。我的第一个猜测是循环运行得很快,线程使用的值与传递的值不同,因为 x 更新得太快了。我尝试用 a 解决这个问题,Thread.Sleep(50)
但问题仍然存在。
编辑:取出不直接处理问题的代码。