这是否保证线程安全/不会产生意外结果?
Interlocked.Increment(ref _arr[i]);
我的直觉告诉我这不是,即读取_arr [i]中的值不能保证在实际递增时是'原子'。
如果我认为这是错误的,我该如何解决这个问题?感谢。
答案 0 :(得分:14)
假设没有任何变化i
或_arr
,那应该没问题。
数组被视为变量的集合;无论该元素或同一数组中的其他元素发生了什么,互锁增量都应该正常工作。
答案 1 :(得分:1)
如果某些 异步更改_arr
或i
,那么我同意你的意见,不,查找_arr[i]
本身不一定是原子的。
然而,正如Jon所说,一旦你确定了(某些)_arr
的元素,它将以原子方式递增,独立于阵列其他元素中发生的其他动作( s),或对_arr
或i
的进一步更改。
如果_arr
或i
被异步更改,所有对它们的引用( 读取和写入)都需要在{ {1}}在一个共同的对象上。 (然后,您可以将lock
缩减为简单的Interlocked.Increment
。