Я собирался реализовать несколько блокировок чтения / записи, упомянутых здесь
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.
Я запутался, как эта реализация решает проблему доступа нескольких читателей к общему ресурсу.
EnterReader
просто делает быструю блокировку, чтобы увеличить количество читателей. Обратите внимание, что освобождает замки перед возвратом. При чтении m_csWrite
не остается запертым между EnterReader
а также LeaveReader
звонки, как это происходит между EnterWriter
а также LeaveWriter
,
Пример использования:
lock->EnterReader();
/*Do the reading*/ //No locks here. m_csReaderCount is blocking writes.
lock->LeaveReader();
Других решений пока нет …