使用pthread条件变量和rwlock

Doo*_*day 9 c c++ posix pthreads producer-consumer

我正在寻找一种方法来使用pthread rwlock结构和C++中的条件例程.

我有两个问题:

第一:如何可能,如果我们不能,为什么?

第二:为什么当前的POSIX pthread没有实现这种行为?

为了理解我的目的,我解释了我的用途:我有一个处理一个共享数组的生产者 - 消费者模型.消费者将在数组为空时cond_wait,但在读取某些元素时将使用rdlock.当添加(+信号)或从阵列中移除elems时,生产者将发生扭曲.

使用rdlock而不是mutex_lock的好处是提高性能:当使用mutex_lock时,几个读取器会阻塞,而使用rdlock时,几个读取器不会阻塞.

Rar*_*arr 6

我假设"条件"是指"条件变量".他们是不同的东西.

不,在等待条件变量时不能使用rwlock.我不能回答"为什么",但这就是POSIX决定这样做的方式.也许只是为了让事情变得简单.

但是,通过在不使用POSIX rwlock的情况下仅使用互斥锁和2个条件变量来创建自己的rwlock类,您仍然可以获得所需的行为:

getReadLock():
     lock(mutex)
     while(array.empty())
         wait(readersCondVar, mutex)
     readers++;
     unlock(mutex)       

releaseReadLock():
     lock(mutex)
     if (--readers == 0)
           broadcast(writerCondVar, mutex) // or signal, if only 1 producer
     unlock(mutex)

readerThread:
     forever() {
         getReadLock()
         read()
         releaseReadLock()
      }

getWriteLock():
     lock(mutex)
     while(readers) {
         wait(writerCondVar, mutex)
     }

releaseWriteLock():
     broadcast(readersCondVar, mutex)
     unlock(mutex)

writerThread():
      forever() {
         getWriteLock()
         write()
         releaseWriteLock()
      }
Run Code Online (Sandbox Code Playgroud)

简单,做你想要的.