多线程问题更新值

时间:2015-09-16 12:17:44

标签: c# multithreading

我很难理解为什么多线程在线程完成之前无法更新值。单独的线程是否有自己的引用或值副本?

如果没有,根据我的理解,调用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
    }
}

2 个答案:

答案 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.VolatileReadThread.VolatileWrite读取以便读取和写入&#34;通过&#34;缓存。

比照。 the chapter on threading in c# 3.0 in a Nutshell要求解释。 (查找问题&#34; Wait方法是否可以写&#34; False&#34;?&#34;。这个例子基本上就是你的情况。)