本地部署AI大模型之并行计算:什么是可重入互斥锁/递归锁

目录

1. 普通互斥锁的局限性

2. 可重入互斥锁的工作原理

3. 使用场景

4. 代码示例

5. 实现关键

6. 注意事项


可重入互斥锁Reentrant Mutex,或称为递归锁)是一种特殊类型的互斥锁,允许同一线程多次获取同一把锁而不会导致死锁。以下是其核心要点:

1. 普通互斥锁的局限性

  • 普通互斥锁(Mutex)在同一个线程中只能被获取一次。若线程尝试重复获取已持有的锁,会导致自死锁(线程无限等待自己释放锁)。

2. 可重入互斥锁的工作原理

  • 线程标识 + 计数器:记录当前持有锁的线程和一个计数器。

    • 当线程首次获取锁时,记录线程ID,计数器设为1。

    • 同一线程再次获取时,计数器递增。

    • 每次释放锁时,计数器递减,直到为0时完全释放锁。

  • 重入性:同一线程可多次获取锁,其他线程需等待锁完全释放(计数器归零)。

3. 使用场景

  • 递归调用:函数A获取锁后调用函数B,函数B也需同一锁。

  • 回调或嵌套逻辑:代码路径中可能多次进入需要同步的代码段。

  • 对象方法链:多个方法需加锁,且方法间相互调用。

4. 代码示例

import threading

lock = threading.RLock()

def func1():
    with lock:
        func2()

def func2():
    with lock:
        print("Inside func2")

func1()

5. 实现关键

  • 线程ID检查:锁释放时验证当前线程是否为持有者。

  • 计数器管理:确保获取和释放次数严格匹配,避免过早释放或泄漏。

6. 注意事项

  • 性能开销:维护线程ID和计数器比普通锁略高。

  • 释放匹配:必须确保每次获取都有对应的释放,否则计数器错误会导致锁无法释放。

  • 跨线程风险:仅解决同一线程的重入问题,跨线程同步仍需谨慎。

你可能感兴趣的:(Devops,Computer,knowledge,开发语言,python,软件工程,性能优化)