数组的ReaderWriterLock

hel*_*low 4 c# multithreading locking

我有一个代表库存的数组,其中包含近50个元素(项目:一些Costum对象),并且我需要一个readerwritelock(好吧,我认为一个简单的锁也足够了)。它应该支持参考值更改和值更改。

由于对数组不同位置的读写是线程安全的(Proof),因此我想确保对同一数组位置的多个读/写操作也是线程安全的。

我当然可以创建50个readerwriterlock,但是我不想要这个;)有没有办法存档?(我知道ConcurrentList / Dictionary / etc。但是我想要一个数组...)

谢谢

Mar*_*ell 5

如果要替换数组中的引用,那么这已经很安全了,因为引用交换本质上是原子的。因此,您可以使用:

var val = arr[index];
// now work with val
Run Code Online (Sandbox Code Playgroud)

var newVal = ...
arr[index] = newVal;
Run Code Online (Sandbox Code Playgroud)

完全安全,至少在避免引用撕裂方面。因此,一种实用的选择是使对象不可变,仅采用上述方法即可。如果需要更改该值,请获取一个本地副本,根据该副本创建一个新版本,然后交换它们。如果丢失更新是一个问题,那么Interlocked.CompareExchange重新申请循环就可以非常成功地使用(即,您不断申请更改直到“获胜”为止)。这避免了任何锁定的需要。

但是,如果您要对单个对象进行突变,那么游戏将发生变化。您可以使对象在内部具有线程安全性,但这通常不是很漂亮。您可以为所有对象设置一个锁。但是,如果您想要粒度锁定,则将需要多个锁定。

我的建议:使对象不可变,仅使用原子引用交换技巧即可。