#locks #mutex #thread #key-value-store #data-structures

lockable

此库提供具有可锁定单个条目的哈希表和缓存数据结构

8 个版本

0.0.8 2024 年 1 月 25 日
0.0.7 2023 年 12 月 15 日
0.0.6 2022 年 11 月 23 日
0.0.2 2022 年 4 月 11 日

151并发

Download history 33/week @ 2024-04-15 80/week @ 2024-04-22 34/week @ 2024-04-29 37/week @ 2024-05-06 23/week @ 2024-05-13 42/week @ 2024-05-20 203/week @ 2024-05-27 351/week @ 2024-06-03 59/week @ 2024-06-10 51/week @ 2024-06-17 68/week @ 2024-06-24 38/week @ 2024-07-01 30/week @ 2024-07-08 43/week @ 2024-07-15 250/week @ 2024-07-22 362/week @ 2024-07-29

686 每月下载量

MIT/Apache

325KB
4.5K SLoC

Build Status Latest Version docs.rs License License codecov unsafe forbidden

lockable

lockable 库提供线程安全的 HashMap(见 LockableHashMap)、LruCache(见 LockableLruCache)和 LockPool(见 LockPool)类型。在这些数据类型中,即使映射或缓存中不存在该键的条目,也可以锁定/解锁单个键。

这可以非常有助于同步对底层键值存储的访问或用于在底层键值存储之上构建缓存数据结构。

LRU 缓存示例

此示例构建一个简单的 LRU 缓存并锁定一些条目。

use lockable::{AsyncLimit, LockableLruCache};

let lockable_cache = LockableLruCache::<i64, String>::new();

// Insert an entry
lockable_cache.async_lock(4, AsyncLimit::no_limit())
    .await?
    .insert(String::from("Value"));

// Hold a lock on a different entry
let guard = lockable_cache.async_lock(5, AsyncLimit::no_limit())
    .await?;

// This next line would wait until the lock gets released,
// which in this case would cause a deadlock because we're
// on the same thread
// let guard2 = lockable_cache.async_lock(5, AsyncLimit::no_limit())
//    .await?;

// After dropping the corresponding guard, we can lock it again
std::mem::drop(guard);
let guard2 = lockable_cache.async_lock(5, AsyncLimit::no_limit())
    .await?;

Lockpool 示例

此示例使用 LockPool 数据结构构建一个简单的锁池。锁池是一个可锁定锁的池。如果您不需要缓存,但只需要同步对底层资源访问的一种方式,则可以使用它。

use lockable::LockPool;

let lockpool = LockPool::new();
let guard1 = lockpool.async_lock(4).await;
let guard2 = lockpool.async_lock(5).await;

// This next line would wait until the lock gets released,
// which in this case would cause a deadlock because we're
// on the same thread.
// let guard3 = lockpool.async_lock(4).await;

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

HashMap 示例

如果您需要一个可锁定的键值存储,但不需要 LRU 排序,则可以使用 LockableHashMap

use lockable::{AsyncLimit, LockableHashMap};

let lockable_map = LockableHashMap::<i64, String>::new();

// Insert an entry
lockable_map.async_lock(4, AsyncLimit::no_limit())
    .await?
    .insert(String::from("Value"));

// Hold a lock on a different entry
let guard = lockable_map.async_lock(5, AsyncLimit::no_limit())
    .await?;

// This next line would wait until the lock gets released,
// which in this case would cause a deadlock because we're
// on the same thread
// let guard2 = lockable_map.async_lock(5, AsyncLimit::no_limit())
//    .await?;

// After dropping the corresponding guard, we can lock it again
std::mem::drop(guard);
let guard2 = lockable_map.async_lock(5, AsyncLimit::no_limit())
    .await?;

包功能

许可证:MIT OR Apache-2.0

依赖关系

~5–7MB
~111K SLoC