#order #locking #deadlock

lock_order

用于帮助生成确定性锁排序的实用宏,以防止死锁

1 个不稳定版本

0.1.0 2021年5月23日

#790过程宏

MIT 许可协议

8KB
58

锁排序宏。

存在理由

此crate提供了一个简单的锁排序procmacro,以确保确定性锁排序,这对于防止细粒度互斥锁之间的死锁是有用的模式。

它还用于在锁中毒的情况下移除线程间恐慌传播的unwrap()。这是处理已经恐慌的程序的首选方法,但它使得在代码中查找其他非有效使用unwrap()变得困难。

基本用法

  • 根据您是否需要可变性,mut是可选的,但它必须位于标识符之前
  • 标识符可以是多个字段查找,例如 self.locks.connections,并将导致一个绑定变量 connections 作为完整标识符的最后部分。
  • 可以提供一个或多个锁,它们之间由 , 分隔,它们将按绑定变量名称的字典顺序排序。

例如,以下示例

use lock_order::lock;
use std::sync::Mutex;

let lock1 = Mutex::new(1);
let lock2 = Mutex::new(2);
let lock3 = Mutex::new(3);
{
    lock!(mut lock2, lock3, mut lock1);
    *lock1 = 3 + *lock3;
    *lock2 = 4 + *lock3;
}

将扩展为

use lock_order::lock;
use std::sync::Mutex;

let lock1 = Mutex::new(1);
let lock2 = Mutex::new(2);
let lock3 = Mutex::new(3);
{
    let (mut lock1, mut lock2, lock3) = (lock1.lock().unwrap(), lock2.lock().unwrap(),
    lock3.lock().unwrap());
    *lock1 = 3 + *lock3;
    *lock2 = 4 + *lock3;
}

未来方向

  • RwLock支持
  • 对裸非中毒锁(如parking_lot)的支持,这些锁不需要unwrap()

没有运行时依赖项