c# - 多线程问题更新值

标签 c# multithreading

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

如果不是,根据我的理解,当调用 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/

相关文章:

c# - 格式化逻辑属于 MVC 的什么地方?

c# - 旧的 C# 类向导去哪儿了?

c# - 无重叠捕获

java - Kafka 0.11 中 sendOffsetsToTransaction 的含义

c# - HttpClient 的 ReadWriteTimeout 替代方案是什么

c# - 使用导航属性发布新实体

c++ - 如何读锁多线程C++程序

java - 什么时候 1 个线程比同时运行的多个线程运行得更快

c - 如何在c linux中销毁线程

java - Observable 不是异步的