#locks #thread #mutex #locking

lockpool

本库提供了一个锁池,其中可以通过键来锁定/解锁单个锁

8 个版本 (5 个稳定)

3.0.1 2022年11月23日
2.0.1 2021年10月16日
1.0.0 2021年10月15日
0.3.0 2021年10月15日
0.1.0 2021年10月15日

#569并发

每月22 次下载

MIT/Apache

79KB
1.5K SLoC

Build Status Latest Version docs.rs License License codecov

lockpool

本库不再维护。请使用 lockable crate 代替。

它提供了一个 LockPool 数据结构 几乎与该 crate 提供的功能相同。 在 README 中有一个 锁池示例

本库提供了一个锁池,其中可以通过键来锁定/解锁单个锁。它最初将所有键视为“未锁定”,但它们可以被锁定,如果第二个线程尝试为相同的键获取锁,它们将必须等待。

use lockpool::{LockPool, SyncLockPool};

let pool = SyncLockPool::new();
let guard1 = pool.lock(4)?;
let guard2 = pool.lock(5)?;

// This next line would cause a deadlock or panic because `4` is already locked on this thread
// let guard3 = pool.lock(4)?;

// After dropping the corresponding guard, we can lock it again
std::mem::drop(guard1);
let guard3 = pool.lock(4)?;

只要该类型实现了 PartialEq + Eq + Hash + Clone + Debug,您就可以使用任意类型来索引锁。

use lockpool::{LockPool, SyncLockPool};

#[derive(PartialEq, Eq, Hash, Clone, Debug)]
struct CustomLockKey(u32);

let pool = SyncLockPool::new();
let guard = pool.lock(CustomLockKey(4))?;

在底层,一个 LockPool 是一个 HashMapMutex,其中包含一些逻辑来确保在访问哈希表时没有竞争条件。

如果启用了 tokio 功能,则此 crate 还提供了 [TokioLockPool],允许在 await 点之间保持锁。

许可证:MIT OR Apache-2.0

依赖关系

~0.4–2MB
~39K SLoC