我有一个数组,它代表一个库存,有近 50 个元素(项目:一些服装对象),我需要一个读写锁(好吧,我认为一个简单的锁也足够了)。它应该支持引用更改和值更改。

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

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

谢谢

最佳答案

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

var val = arr[index];
// now work with val


var newVal = ...
arr[index] = newVal;

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

但是,如果您正在改变单个对象,那么游戏就会改变。您可以使对象在内部成为线程安全的,但这通常不太好。您可以为所有对象使用一个锁。但是如果您想要粒度锁定,那么您将需要多个锁。

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

关于c# - ReaderWriterLock 数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11950628/

10-10 08:31
查看更多