Jer*_*emy 6 .net synchronization locking cross-process readerwriterlock
是否存在跨进程工作的读/写锁定机制(类似于Mutex,但是读/写而不是独占锁定)?我想允许并发读访问,但独占写访问.
Windows不包含跨进程Reader-Writer锁.可以使用Semaphore和Mutex的组合来构造一个(Mutex由作者独立访问或由读者持有,然后读者使用Semaphore释放其他读者 - 即编写者将等待互斥体和读者) .
但是,如果预期争用率很低(即没有线程长时间持有锁),那么互斥可能仍然会更快:读写器锁的额外复杂性压倒了允许多个读者进入的任何好处.(读写器)如果有更多的读者和锁定持续很长时间,锁定只会更快 - 但只有你的分析可以确认这一点.)
没有.正如理查德在上面提到的那样,.NET中没有这种开箱即用的机制.这是使用互斥锁和信号量实现它的方法.
方法#1在http://www.joecheng.com/blog/entries/Writinganinter-processRea.html中描述,引用:
// create or open global mutex
GlobalMutex mutex = new GlobalMutex("IdOfProtectedResource.Mutex");
// create or open global semaphore
int MoreThanMaxNumberOfReadersEver = 100;
GlobalSemaphore semaphore = new GlobalSemaphore("IdOfProtectedResource.Semaphore", MoreThanMaxNumberOfReadersEver);
public void AcquireReadLock()
{
mutex.Acquire();
semaphore.Acquire();
mutex.Release();
}
public void ReleaseReadLock()
{
semaphore.Release();
}
public void AcquireWriteLock()
{
mutex.Acquire();
for (int i = 0; i < MoreThanMaxNumberOfReadersEver; i++)
semaphore.Acquire(); // drain out all readers-in-progress
mutex.Release();
}
public void ReleaseWriteLock()
{
for (int i = 0; i < MoreThanMaxNumberOfReadersEver; i++)
semaphore.Release();
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是:
读锁定 - 如上所述.写锁定如下(伪代码):
- Lock mutex
- Busy loop until the samaphore is not taken AT ALL:
-- wait, release.
-- Release returns value;
-- if value N-1 then break loop.
-- yield (give up CPU cycle) by using Sleep(1) or alternative
- Do write
- Release mutex
Run Code Online (Sandbox Code Playgroud)
必须注意的是,更有效的方法是可行的,如下所示:http://en.wikipedia.org/wiki/Readers-writers_problem#The_second_readers-writers_problem 在上面的文章中查找"此解决方案不是最理想的".