3 个版本 (破坏性)
新 0.2.0 | 2024 年 8 月 18 日 |
---|---|
0.1.0 | 2024 年 7 月 9 日 |
0.0.0 | 2024 年 3 月 27 日 |
#536 在 并发
每月 22 次下载
31KB
556 行
排序锁
提供有序锁定的软件包。这意味着锁将始终以相同顺序锁定,而不管调用方法的顺序如何。这减少了由于一个锁等待另一个锁而导致的死锁。特别是,以下情况在仅使用锁排序时不会发生
- 线程 A 获取
lock1
。 - 线程 B 获取
lock2
。 - 线程 A 尝试获取
lock2
,但它被线程 B 锁定。 - 线程 B 尝试获取
lock1
,但它被线程 A 锁定。 - 两个线程都无法继续,并且不会解锁,因此发生了死锁。
使用锁排序时,这种情况不会发生,因为两个线程总是以相同的顺序锁定锁。这是通过首先请求锁定每个锁来实现的。然后,通过将锁放入元组中并调用 lock_all
方法,锁将以与元组中的顺序无关的顺序锁定。
为了允许排序锁定,此软件包提供了两种新的锁类型
SortMuted
-Mutex
的排序版本。SortRwLock
-RwLock
的排序版本。
示例
use sortlock::{SortMutex, LockGroup};
let lock1 = SortMutex::new("some value");
let lock2 = SortMutex::new("some other value");
// Here lock1 is locked then lock2.
let (guard1, guard2) = (lock1.lock(), lock2.lock()).lock_all();
println!("{}", *guard1);
println!("{}", *guard2);
// Unlock so we can lock again.
drop(guard1);
drop(guard2);
// Despite the order change the same is true here.
let (guard2, guard1) = (lock2.lock(), lock1.lock()).lock_all();
println!("{}", *guard1);
println!("{}", *guard2);
功能标志
为了支持 no-std
环境,此软件包可以回退到使用 spin
的 Mutex
和 RwLock
类型。这可以通过禁用 std
功能来实现。
依赖关系
~1MB
~18K SLoC