#mutex #map #lock #rwlock #session

无需std key-mutex

通过键访问互斥锁

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并发 中排名

Download history 2/week @ 2024-04-13 1/week @ 2024-05-18 1/week @ 2024-06-08

每月190 次下载

MIT 许可证

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