1 个不稳定版本
0.1.0 | 2021年5月23日 |
---|
#790 在 过程宏
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()
。