实现一个c#读写锁,其中一些读操作会产生写操作
我必须实现一些.Net代码,这些代码涉及由不同线程访问的共享资源。原则上,这应该通过一个简单的读写锁来解决。然而,我的解决方案要求某些读访问最终产生写操作。我首先检查了ReaderWriterLockSlim,但它本身并不能解决问题,因为它要求我提前知道读操作是否可以转变为写操作,而我的情况并非如此。最后,我选择了简单地使用ReaderWriterLockSlim,当读操作“检测到”需要执行写操作时,释放读锁并获取写锁。我不确定是否有更好的解决方案,或者这个解决方案是否会导致一些同步问题(我有Java方面的经验,但我对.Net还比较陌生) 下面是说明我的解决方案的一些示例代码:实现一个c#读写锁,其中一些读操作会产生写操作,c#,.net,readwritelock,C#,.net,Readwritelock,我必须实现一些.Net代码,这些代码涉及由不同线程访问的共享资源。原则上,这应该通过一个简单的读写锁来解决。然而,我的解决方案要求某些读访问最终产生写操作。我首先检查了ReaderWriterLockSlim,但它本身并不能解决问题,因为它要求我提前知道读操作是否可以转变为写操作,而我的情况并非如此。最后,我选择了简单地使用ReaderWriterLockSlim,当读操作“检测到”需要执行写操作时,释放读锁并获取写锁。我不确定是否有更好的解决方案,或者这个解决方案是否会导致一些同步问题(我有J
public class MyClass
{
private int[] data;
private readonly ReaderWriterLockSlim syncLock = new ReaderWriterLockSlim();
public void modifyData()
{
try
{
syncLock.EnterWriteLock();
// clear my array and read from database...
}
finally
{
syncLock.ExitWriteLock();
}
}
public int readData(int index)
{
try
{
syncLock.EnterReadLock();
// some initial preprocessing of the arguments
try
{
_syncLock.ExitReadLock();
_syncLock.EnterWriteLock();
// check if a write is needed <--- this operation is fast, and, in most cases, the result will be false
// if true, perform the write operation
}
finally
{
_syncLock.ExitWriteLock();
_syncLock.EnterReadLock();
}
return data[index];
}
finally
{
syncLock.ExitReadLock();
}
}
}
公共类MyClass
{
私有int[]数据;
私有只读ReaderWriterLockSlim syncLock=新的ReaderWriterLockSlim();
公共void modifyData()
{
尝试
{
syncLock.EnterWriteLock();
//清除我的数组并从数据库中读取。。。
}
最后
{
syncLock.ExitWriteLock();
}
}
公共整型读取数据(整型索引)
{
尝试
{
syncLock.EnterReadLock();
//参数的一些初始预处理
尝试
{
_syncLock.exitradlock();
_syncLock.EnterWriteLock();
//检查是否需要写入为什么不能只使用两个普通对象(一个用于读取,一个用于写入)和“锁定”语句?这是否是一个好的解决方案取决于您在readData
中执行的操作的性质。我想您已经意识到,读写器都可以在exitradlock
和EnterWriteLock
之间拦截您。如果您对此没有问题,那么就可以了。ReaderWriter锁类有:方法UpgradeToWriterLock()--这适用于像您这样的场景。@Matas使用两个单独的锁不是解决方案,因为这会导致写入与读取同时执行。@Prateek the UpgradeToWriterLock()这种方法涉及到一次只能访问一个线程,失去了同时读取的优势。在我理解的范围内,以可升级模式进入只能访问一个线程。