如果我ReaderWriterLockSlim
用来获取读/写锁,我需要制作变量volatile
还是使用Interlocked.Increment
?
例如,Add
下面方法中的代码是否可以正常工作,还是需要增强?
public class AppendableList<T> { // semi-immutable; supports appending only
private T[] data = new T[16];
private ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
public int Count { get; private set; }
public T this[int index] {
get {
rwLock.EnterReadLock();
try { return data[index]; } finally { rwLock.ExitReadLock(); }
}
}
public void Add(T item) {
rwLock.EnterUpgradeableReadLock();
try {
if (Count == data.Length)
reAllocateArray(); // upgrades to write lock
data[Count++] = item; // do I need to use Interlocked here?
} finally { rwLock.ExitUpgradeableReadLock(); }
}
}
编辑:我正在尝试编写一个轻量级、快速且简单的列表,该列表允许多个线程同时访问其数据(类似于生产者-消费者缓冲区)。我已经编辑了上面的代码,删除了我之前使用的简化,所以现在问题应该更清楚了。在我看来,这段代码是线程安全的,但我不确定Count
在退出可升级锁后是否所有线程都会看到更新的值。
编辑2:这里的“写”锁用于指示写入数组引用,而不是数组元素。我假设这已经足够了(因为数据本身是不可变的)。我想我需要在递增时使用 Interlocked Count
。真的吗?