Ищется Cross-process Reader/Writer Lock поддерживающий re-entrancy
От: MozgC США http://nightcoder.livejournal.com
Дата: 27.02.19 22:17
Оценка:
Здравствуйте,

Задача:
На одной машине одновременно выполняются разные процессы (написанные нами). Нужно, чтобы эти процессы могли одновременно иметь доступ к ресурсу в режиме чтения, но только один процесс мог одновременно писать (при этом нельзя, чтобы в это время кто-то еще читал).

Вначале, я написал класс с использованием мьютекса и семафора (приведен ниже, может кому пригодится). Но только потом понял, что нам в нашей задаче нужно поддерживать 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?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.