2021-07-21

本文介绍了可重入锁的基本概念,即允许同一线程重复获取锁,防止死锁的发生。并展示了如何使用C++实现一个简单的可重入锁,通过维护持有锁的线程ID和获取次数来确保正确性。同时,提到了使用pthread库创建可重入锁的方法,通过设置锁的属性为PTHREAD_MUTEX_RECURSIVE。参考文献提供了更深入的阅读材料。
摘要由CSDN通过智能技术生成

可重入的mutex

基本概念

可重入锁(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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值