为什么pthread_rwlock可以递归获取写锁定?

时间:2019-07-26 17:47:22

标签: c++ multithreading boost pthreads mutex

如果我尝试在同一线程中多次获取写锁定,则它总是成功。

下面是示例代码,我希望它在第二次尝试获取写锁时会挂断。

#include <iostream>
#include <pthread.h>
int main(int argc, char *argv[]) {
  pthread_rwlock_t rwlock_;
  pthread_rwlockattr_t rwlock_attr;
  pthread_rwlockattr_init(&rwlock_attr);
  pthread_rwlockattr_setkind_np(&rwlock_attr, PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);
  pthread_rwlock_init(&rwlock_, &rwlock_attr);

  pthread_rwlock_wrlock(&rwlock_);
  pthread_rwlock_wrlock(&rwlock_);  // should blocked here
}

但是它两次获得了写锁定。而且,无论我如何更改attr,结果都是一样的。

如果我启动另一个线程,并且两个线程都尝试获取写锁,则其中一个线程将被阻塞。所以这是否意味着pthread_rwlock可以识别不同的线程?

我也尝试过boost::shared_lock

#include <boost/thread/locks.hpp>
#include <boost/thread/lock_types.hpp>
#include <boost/thread/pthread/shared_mutex.hpp>

int main(int argc, char *argv[]) {
  boost::shared_mutex mtx;
  boost::unique_lock<boost::shared_mutex> wlock(mtx);
  boost::unique_lock<boost::shared_mutex> wlock2(mtx);

}

然后,当我的程序第二次尝试获取写锁定时,它将被阻止。因此,行为不同于pthread_rwlock

我想知道它们是如何在内部实现的。是否可以区分不同的线程?读/写锁应该具有什么标准行为?

0 个答案:

没有答案