我很难理解为什么多线程失败线程完成之前更新值。单独的线程是否有自己的引用或值的副本?
多线程问题,更新的价值
如果不是这样,我的理解下面的代码应能正常工作时的MyMethod被调用,但通常不会在thread.IsAlive
之前创建数组中的一些的MyType对象的实例为假:
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()'中的第一个语句是'Thread.Sleep(1000)',可能只有'obj [Environment.ProcessorCount - 1]'是非空的,因为循环会将'i'增加到它的最终值在创建第一个对象之前。考虑一下,FillObjects()可能会抛出,因为在循环退出之前'i'实际上会增加到'Environment.ProcessorCount-1',因此超出了'obj'的范围。 –
感谢您的回复,确实这是主要问题之一,现在它正确地实例化对象。然而,线程在关闭之前并未完全正确地完成所有操作,而是随机执行此操作。有什么建议么? – Almis
我发现自己的逻辑错误,现在它正常工作。 – Almis