Здравствуйте,
Задача:
На одной машине одновременно выполняются разные процессы (написанные нами). Нужно, чтобы эти процессы могли одновременно иметь доступ к ресурсу в режиме чтения, но только один процесс мог одновременно писать (при этом нельзя, чтобы в это время кто-то еще читал).
Вначале, я написал класс с использованием мьютекса и семафора (приведен ниже, может кому пригодится). Но только потом понял, что нам в нашей задаче нужно поддерживать re-entrancy (т.е. чтобы один и тот же поток мог повторно захватить блокировку), а семафор этого не поддерживает.
public class CrossProcessReaderWriterLock
{
private readonly string _name;
const int _maxReaders = 10;
readonly Mutex _mutex;
readonly Semaphore _semaphore;
public CrossProcessReaderWriterLock(string name)
{
_name = name;
_mutex = new Mutex(false, name + ".Mutex");
_semaphore = new Semaphore(_maxReaders, _maxReaders, name + ".Semaphore");
}
public void AcquireReaderLock()
{
//Log.Info($"{_name} acquiring reader lock...");
_mutex .WaitOne();
_semaphore.WaitOne();
_mutex .ReleaseMutex();
//Log.Info($"{_name} reader lock acquired.");
}
public void ReleaseReaderLock()
{
_semaphore.Release();
//Log.Info($"{_name} reader lock released.");
}
public void AcquireWriterLock()
{
//Log.Info($"{_name} acquiring writer lock...");
_mutex.WaitOne();
for (int i = 0; i < _maxReaders; i++)
_semaphore.WaitOne(); // drain out all readers-in-progress
_mutex.ReleaseMutex();
//Log.Info($"{_name} writer lock acquired.");
}
public void ReleaseWriterLock()
{
for (int i = 0; i < _maxReaders; i++)
_semaphore.Release();
//Log.Info($"{_name} writer lock released.");
}
}
Есть у кого-нибудь хорошие идеи реализации такого класса с поддержкой re-entrancy?