我很难理解为什么多线程无法在线程完成之前更新值。单独的线程是否有自己的引用或值副本?
如果不是,根据我的理解,当调用 MyMethod 时,下面的代码应该可以正常工作,但它通常不会在 thread.IsAlive
变为 false 之前在数组中创建某些 MyType 对象的实例:< br/>
class MyClass
{
static MyType[] obj = new MyType[Environment.ProcessorCount - 1];
void MyMethod()
{
Thread[] threads = new Thread[Environment.ProcessorCount - 1];
for (int i = 0; i < Environment.ProcessorCount - 1; i++)
{
threads[i] = new Thread(() => FillObjects(i));
threads[i].Priority = ThreadPriority.AboveNormal;
threads[i].Start();
}
while (threads[i].Any(c => c.IsAlive))
{
Thread.Sleep(50);
}
}
void FillObjects(int i)
{
obj[i] = new MyType();
//perform actions with obj[i] to fill it with necessary values
}
}
最佳答案
您需要将循环变量的值赋给一个局部变量。否则,FillObjects(i)
的第一次执行可能是在 i
递增之后执行的,因此永远不会调用 FillObjects(0)
,因此 obj[0]
从未被赋值。
void MyMethod()
{
Thread[] threads = new Thread[Environment.ProcessorCount - 1];
for (int i = 0; i < Environment.ProcessorCount - 1; i++)
{
int local = i;
threads[i] = new Thread(() => FillObjects(local));
threads[i].Priority = ThreadPriority.AboveNormal;
threads[i].Start();
}
while (threads.Any(c => c.IsAlive))
{
Thread.Sleep(50);
}
}
关于c# - 多线程问题更新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32608384/