并行为数组不同元素赋值是否存在风险?技术咨询
这种数组并行赋值操作是完全安全的
放心,你的这种用法没有任何线程安全风险,原因如下:
操作的内存区域完全隔离:你的代码里每个并行线程负责处理独立的一行,对应数组的索引范围是
z*ObjectsPerEdge到(z+1)*ObjectsPerEdge - 1,不同线程的索引范围完全不重叠——也就是说,每个线程只对独属于自己的数组元素进行赋值,绝不会触碰其他线程负责的元素。这种完全无交集的内存操作,天然不会产生并发冲突。引用类型赋值的额外保障:在.NET中,引用类型的赋值操作本身就是原子性的(依据ECMA-335标准),哪怕退一步说,就算这个操作不是原子的,只要各个线程操作的是不同的内存位置,也不会出现数据损坏的情况。
构造函数线程安全:你已经明确说明
MyClass的构造函数是完全线程安全的,这就排除了构造过程中因为共享状态导致的线程问题——每个new MyClass(...)都是独立的实例化过程,不会互相干扰。
这种按行拆分并行处理的模式,是处理独立数据集合的经典安全写法,只要保持线程间的操作范围不重叠,就可以放心使用。
内容的提问来源于stack exchange,提问作者el_zilcho
相关产品推荐
相关产品推荐

