Блокировка чтения и записи

Я собирался реализовать несколько блокировок чтения / записи, упомянутых здесь
MultiplereadersWriterLock

Здесь код для EnterReader есть

void EnterReader(void)
{
EnterCriticalSection(&m_csWrite);
EnterCriticalSection(&m_csReaderCount);
if (++m_cReaders == 1)
ResetEvent(m_hevReadersCleared);
LeaveCriticalSection(&m_csReaderCount);
LeaveCriticalSection(&m_csWrite);
}

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

пример

Thread T1 calls EnterReader()
It acquires m_csWrite
It acquires m_csReaderCount
Interrupted by CPU and thread T2 starts

Thread T2 calls EnterReader()
Since m_csWrite already acquired by T1 so how thread T2 can perform read.
T2 cannot proceed further since m_csWrite is already acquired that means T2 reader thread is blocked and waiting for T1 to get finish.

Я запутался, как эта реализация решает проблему доступа нескольких читателей к общему ресурсу.

0

Решение

EnterReader просто делает быструю блокировку, чтобы увеличить количество читателей. Обратите внимание, что освобождает замки перед возвратом. При чтении m_csWrite не остается запертым между EnterReader а также LeaveReader звонки, как это происходит между EnterWriter а также LeaveWriter,

Пример использования:

lock->EnterReader();
/*Do the reading*/ //No locks here. m_csReaderCount is blocking writes.
lock->LeaveReader();
0

Другие решения

Других решений пока нет …