如果我尝试在同一线程中多次获取写锁定,则它总是成功。
下面是示例代码,我希望它在第二次尝试获取写锁时会挂断。
#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
。
我想知道它们是如何在内部实现的。是否可以区分不同的线程?读/写锁应该具有什么标准行为?