我很难理解为什么多线程在线程完成之前无法更新值。单独的线程是否有自己的引用或值副本?
如果没有,根据我的理解,调用MyMethod时下面的代码应该可以正常工作,但是在thread.IsAlive
变为false之前,它通常不会在数组中创建一些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
}
}
答案 0 :(得分:6)
您需要将循环变量的值赋给局部变量。否则,在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);
}
}
答案 1 :(得分:-1)
在多处理器计算机(您必须拥有)上,由于缓存,写入一个线程中的内存位置的结果可能在另一个线程中不可见。使用Thread.VolatileRead
和Thread.VolatileWrite
读取以便读取和写入&#34;通过&#34;缓存。
比照。 the chapter on threading in c# 3.0 in a Nutshell要求解释。 (查找问题&#34; Wait方法是否可以写&#34; False&#34;?&#34;。这个例子基本上就是你的情况。)