6 个版本
0.2.1 | 2021年11月2日 |
---|---|
0.2.0 | 2021年11月2日 |
0.1.3 | 2021年10月30日 |
#506 in 并发
24KB
482 行
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