可递归锁

可递归锁(也叫循环锁)

概念

在所有的线程同步方法中,恐怕互斥锁(mutex)的出场率远远高于其它方法。互斥锁的理解和基本使用方法都很容易,这里不做更多介绍了。
Mutex可以分为递归锁(recursive mutex)和非递归锁(non-recursive mutex)。可递归锁也可称为可重入锁(reentrant mutex),
非递归锁又叫不可重入锁(non-reentrant mutex)。
二者唯一的区别是,同一个线程可以多次获取同一个递归锁,不会产生死锁。而如果一个线程多次获取同一个非递归锁,则会产生死锁。
Windows下的Mutex和Critical Section是可递归的。Linux下的pthread_mutex_t锁默认是非递归的。

使用场景

用锁锁住一个函数,这个被锁的函数内部也使用同一个锁时候。

可能存在的问题

文章转载出处

http://blog.chinaunix.net/uid-26983585-id-3316794.html

### 递归的概念 递归是一种特殊类型的互斥,允许同一线程在同一位置多次获取同一把而不引起死。这种特性使得递归非常适合用于嵌套函数调用或者循环结构中,其中可能会重复进入相同的临界区[^1]。 在Java环境中,`ReentrantLock` 类实现了递归的功能。当一个线程成功获得该之后,它可以继续请求相同实例上的其他定操作而无需等待解;每次加都会增加内部计数器的值,只有当这个计数值减至零时才会真正释放这把。 对于C++来说,则有 `std::recursive_mutex` 提供类似的机制。它同样支持单个线程内的多重占有行为,并且保证了即使是在不同的作用域内也可以安全地执行这样的操作[^2]。 Linux平台下也有相应的实现方式,即通过设置 `PTHREAD_MUTEX_RECURSIVE` 属性使普通的 `pthread_mutex_t` 成为可重入版本。这意味着如果当前持有者再次尝试上的话并不会被阻塞而是直接返回成功状态码[^4]。 ### 使用方法 为了正确使用递归,在编写程序时应当遵循如下原则: - **初始化**:确保按照所选语言的标准库文档说明正确初始化递归对象。 - **获取/释放资源**:始终成对出现,先调用相应的方法去取得(如 Java 中的 `lock()` 或 C++ 的 `lock_guard/std::unique_lock`),处理完共享数据后再及时解除占用关系(`unlock()`)。 - **异常安全性**:考虑到可能出现意外情况导致流程中断的情况,建议采用 try-finally 结构来保障无论怎样都能正常完成解绑动作,防止潜在的风险隐患存在。 ```java // Java ReentrantLock 示例代码片段 import java.util.concurrent.locks.ReentrantLock; public class Example { private final ReentrantLock lock = new ReentrantLock(); public void outerMethod(){ lock.lock(); // 获取 try{ innerMethod(); } finally { lock.unlock(); // 确保总是会释放 } } private void innerMethod(){ lock.lock(); // 可能会在outerMethod已经持有的情况下再次获取到此 try{ // 执行一些逻辑... } finally { lock.unlock(); } } } ``` ```cpp #include <mutex> using namespace std; class MyClass { private: recursive_mutex mtx_; public: void methodA() { unique_lock<recursive_mutex> lck(mtx_); // do something that may call other methods which also need the same mutex. this->methodB(); } void methodB() { scoped_lock<recursive_mutex> lck(mtx_); // 自动管理生命周期 // more operations here... } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值