6 个版本

0.2.1 2021年11月2日
0.2.0 2021年11月2日
0.1.3 2021年10月30日

#506 in 并发

MIT 许可证

24KB
482

Maintenance

cooptex

cooptex 提供无死锁的 Mutex。`CoopMutex::lock` 方法将 `std::sync::mutex` 返回值包裹在一个 `Result` 中,要求调用者释放其他持有的锁,以便其他线程可以继续执行。这种行为可以通过使用 `retry_loop` 函数轻松实现。

use cooptex::*;
let a = CoopMutex::new(42);
let b = CoopMutex::new(43);

retry_loop(|| {
  let a_lock = a.lock()?.unwrap();
  let b_lock = b.lock()?.unwrap();
  assert_eq!(*a_lock + *b_lock, 85);
  Ok(())
});

该 crate 还提供了一个低开销的函数 `lock`,它可以以一致顺序获取一系列 `std::sync::mutex`,以确保不会发生死锁。如果可以一次性获取所有必要的锁,请使用该函数。

如果您有条件地获取锁,则可能需要使用 `CoopMutex` 和 `retry_loop`。

CoopMutex 保证

该 crate 的目标是保证多个线程通过获取锁无法发生死锁。

该 crate 还会优先选择那些“存活时间最长”且尚未完成工作的线程。这意味着当 `retry_loop` 成功完成时,它将把该线程移至队列末尾,以获取未来的锁。这提供了一个大致公平的调度器。

该 crate 仍在早期开发阶段,因此可能存在未涵盖的情况。如果您可以重现死锁,请提交问题。

不保证

该 crate 明确允许以下可能不受欢迎的行为

  • `CoopMutex::lock` 可能会在可以等待并获取锁而不会发生死锁的情况下返回 `Retry`。
  • `CoopMutex::lock` 可能会无限期地等待然后返回 `Retry`。

未完成

  • 我们尚未完全分析恐慌时的行为。没有不安全的代码,所以我们只能可能发生死锁。

许可证:MIT

依赖项

~1–1.5MB
~31K SLoC