基本概念
可重入锁(Reentrant Lock),是指允许同一个线程多次对该锁进行acquire动作。对于不可重入的锁,当一个线程多次调用acquire后将造成死锁。
基本实现
自己实现一个可重入锁并不困难:我们增加两个field,一个用来记录锁当前被哪个线程拥有;一个用来记录尝试acquire的次数。
下面展示一些 内联代码片
。
// A code block
var foo = 'bar';
#include <stdint.h>
#include <pthread.h>
Class MyReentrantLock
{
public:
MyReentrantLock()
{
lock_holder_ = NULL;
hold_counter_ = 0;
pthread_mutex_init(&lock_, NULL);
}
int lock()
{
int ret = 0;
pthread_t curr_id = pthread_self();
if (lock_holder_ == curr_id) {
++hold_counter_;
} else {
pthread_mutex_lock(&lock_);
lock_holder_ = curr_id;
hold_counter_ = 1;
}
return ret;
}
int unlock()
{
int ret = 0;
pthread_t curr_id = pthread_self();
if (lock_holder_ != curr_id) {
ret = -1;
} else {
if (--hold_counter_ == 0) {
lock_holder_ = NULL;
pthread_mutex_unlock(&lock_);
}
}
return ret;
}
private:
pthread_mutex_t lock_;
pthread_t lock_holder_;
int64_t hold_counter_;
};
默认pthread_mutex_t是不可重入的。为了让它可重入,可以这样:
下面展示一些 内联代码片
。
pthread_mutex_t mutex;
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);//设置可递归也就是可重入
pthread_mutex_init(&mutex, &attr);
参考文献
https://preshing.com/20120305/implementing-a-recursive-mutex/