【问题标题】:Readers Writer lock读写器锁
【发布时间】:2014-03-15 03:43:12
【问题描述】:

我正在通过这里提到的多个读取器/写入器锁的实现 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.

我很困惑这个实现如何解决多个读者访问共享资源的问题。

【问题讨论】:

    标签: c++ multithreading locking


    【解决方案1】:

    EnterReader 只是快速锁定以增加读者的数量。请注意,它会在返回之前释放锁。阅读时,m_csWrite 不会像在 EnterWriterLeaveWriter 之间那样在 EnterReaderLeaveReader 调用之间保持锁定状态。

    使用示例:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2011-12-04
      • 2015-05-24
      • 1970-01-01
      • 2015-05-24
      • 2014-12-25
      • 1970-01-01
      相关资源
      最近更新 更多