#lock #order #sorting #ordered #mutex #rw-lock

no-std sortlock

提供有序锁定的软件包

3 个版本 (破坏性)

0.2.0 2024 年 8 月 18 日
0.1.0 2024 年 7 月 9 日
0.0.0 2024 年 3 月 27 日

#536并发

每月 22 次下载

BSD-3-Clause

31KB
556

排序锁

提供有序锁定的软件包。这意味着锁将始终以相同顺序锁定,而不管调用方法的顺序如何。这减少了由于一个锁等待另一个锁而导致的死锁。特别是,以下情况在仅使用锁排序时不会发生

  1. 线程 A 获取 lock1
  2. 线程 B 获取 lock2
  3. 线程 A 尝试获取 lock2,但它被线程 B 锁定。
  4. 线程 B 尝试获取 lock1,但它被线程 A 锁定。
  5. 两个线程都无法继续,并且不会解锁,因此发生了死锁。

使用锁排序时,这种情况不会发生,因为两个线程总是以相同的顺序锁定锁。这是通过首先请求锁定每个锁来实现的。然后,通过将锁放入元组中并调用 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 环境,此软件包可以回退到使用 spinMutexRwLock 类型。这可以通过禁用 std 功能来实现。

依赖关系

~1MB
~18K SLoC