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 次下载
79KB
1.5K SLoC
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 是一个 HashMap 的 Mutex,其中包含一些逻辑来确保在访问哈希表时没有竞争条件。
如果启用了 tokio
功能,则此 crate 还提供了 [TokioLockPool],允许在 await
点之间保持锁。
许可证:MIT OR Apache-2.0
依赖关系
~0.4–2MB
~39K SLoC