为了账号安全,请及时绑定邮箱和手机立即绑定

C#数组线程安全吗?

C#数组线程安全吗?

C#
大话西游666 2019-12-04 14:31:19
特别是创建一个函数以数组和索引作为参数。创建一个元素数组。创建一个计数循环。在新线程的循环内部,使用传入的索引器将对象的新实例分配给数组。我知道如何管理线程等。我有兴趣知道这是否是线程安全的方法。 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);    }}
查看完整描述

3 回答

?
浮云间

TA贡献1829条经验 获得超3个赞

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

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

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


查看完整回答
反对 回复 2019-12-04
?
暮色呼如

TA贡献1853条经验 获得超9个赞

阵列上的MSDN文档说:


此类型的公共静态(在Visual Basic中为Shared)成员是线程安全的。不保证任何实例成员都是线程安全的。


此实现未为Array提供同步的(线程安全的)包装器;但是,基于Array的.NET Framework类使用SyncRoot属性提供了它们自己的集合的同步版本。


通过集合进行枚举本质上不是线程安全的过程。即使同步了一个集合,其他线程仍然可以修改该集合,这将导致枚举器引发异常。为了保证枚举期间的线程安全,您可以在整个枚举期间锁定集合,也可以捕获由其他线程进行的更改导致的异常。


因此,它们不是线程安全的。


查看完整回答
反对 回复 2019-12-04
?
一只名叫tom的猫

TA贡献1906条经验 获得超2个赞

通常,当一个集合被称为“不是线程安全的”时,这意味着并发访问可能会在内部失败(例如,读取List <T>的第一个元素并不安全,而另一个线程在列表的末尾添加一个元素:List <T>可能会调整基础数组的大小,并且在将数据复制到新数组之前,读取访问权可能会转到新数组。


对于数组,这种错误是不可能的,因为数组是固定大小的,并且没有这种“结构更改”。具有三个元素的数组与三个变量的线程安全性差不多。


C#规范对此没有说明。但是很清楚,如果您了解IL并阅读了CLI规范-您可以获取对数组内元素的托管引用(例如用于C#“ ref”参数的引用),然后进行常规和易失性加载并存储到该元素。CLI规范描述了此类加载和存储的线程安全保证(例如,元素<= 32位的原子性)


因此,如果我正确地理解了您的问题,您想使用不同的线程来填充数组,但是将仅分配给每个数组元素一次?如果是这样,那绝对是线程安全的。


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 1029 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信