一尘不染

C#数组线程安全吗?

c#

特别是

  1. 创建一个函数以数组和索引作为参数。
  2. 创建一个元素数组。
  3. 创建一个计数循环。
  4. 在新线程的循环内部,使用传入的索引器将对象的新实例分配给数组。

我知道如何管理线程等。我有兴趣知道这是否是线程安全的方法。

 class Program
{
    // bogus object
    class SomeObject
    {
        private int value1;
        private int value2;

        public SomeObject(int value1, int value2)
        {
            this.value1 = value1;
            this.value2 = value2;
        }
    }

    static void Main(string[] args)
    {

        var s = new SomeObject[10];
        var threads = Environment.ProcessorCount - 1;
        var stp = new SmartThreadPool(1000, threads, threads);
        for (var i = 0; i < 10; i++)
        {
            stp.QueueWorkItem(CreateElement, s, i);
        }

    }

    static void CreateElement(SomeObject[] s, int index)
    {
        s[index] = new SomeObject(index, 2);
    }
}

阅读 381

收藏
2020-05-19

共1个答案

一尘不染

我相信,如果每个线程仅在数组的单独部分上工作,那么一切都会很好。如果您要 共享 数据(即在线程之间通信),则将需要某种内存屏障来避免内存模型问题。

相信
,如果您生成一堆线程,每个线程都填充其自己的数组部分,然后等待所有这些线程完成使用Thread.Join,那么就屏障而言,这足以确保您的安全。目前,我没有任何支持文档,请注意…

编辑:您的示例代码是安全的。两个线程在任何时候都不会访问同一元素-
好像它们每个都有单独的变量一样。但是,这本身并不太有用。通常,在某个时候,线程将要共享状态-
一个线程将要读取另一线程已写的内容。否则,将它们写入共享数组而不是自己的私有变量是没有意义的。 那是 您需要小心的地方-线程之间的协调。

2020-05-19