4个版本
0.1.3 | 2024年4月6日 |
---|---|
0.1.2 | 2024年3月18日 |
0.1.1 | 2024年3月18日 |
0.1.0 | 2024年3月18日 |
958 在 并发 中排名
每月190 次下载
16KB
402 行
KeyMutex
什么是KeyMutex?
KeyMutex<K, V>
基本上是一个无锁的HashMap<K, Mutex<V>>
(或RwLock
),具有一些额外功能。
我为什么需要它?
想象一下,你有一群用户,他们通过ID来识别,并且你想为每个用户都有一个锁。这时,KeyMutex<K, ()>
就派上用场了。与DashMap<K, Mutex<()>>
的区别在于,KeyMutex
会在最后一个互斥锁保护器释放时自动释放条目。
当你想,比如说,维护一个用户的活跃会话时,事情可能会变得复杂。你需要有一个KeyMutex<K, Vec<Session>>
,你当然不希望条目在会话不为空时被释放。不用担心,KeyMutex
会为你处理这个。只有当Empty::is_empty
返回true
时,条目才会被释放,这是为标准库中的所有集合以及当然也包括KeyMutex
实现的。
lib.rs
:
是HashMap<K, Mutex<V>>
和HashMap<K, RwLock<V>>
的并发、无锁版本。
它自动为您分配互斥锁和读写锁,并在不再使用时自动释放它们。"不再使用"的条件是最后一个保护器被丢弃,并且Empty::is_empty
返回true
。
当V
为()
时,它有点像Web Locks API。
Tokio版本位于tokio
特性之后。
示例
use std::sync::Arc;
use key_mutex::KeyMutex;
fn main() {
let locks = KeyMutex::<u32, BTreeSet<String>>::new();
let mut lock = locks.lock(1).unwrap();
lock.insert("Hello".to_owned());
lock.insert("World".to_owned());
drop(lock);
// Value is not empty and thus is not dropped
assert_eq!(locks.len(), 1);
let mut lock = locks.lock(1).unwrap();
assert_eq!(lock.len(), 2);
lock.clear();
drop(lock);
// Should be dropped now
assert_eq!(locks.len(), 0);
}
依赖关系
~0.9–7MB
~39K SLoC