#locking #parking-lot #policy #object #obtain #variant #recursion

parking_method

通过策略对象获取 parking_lot 锁

4个版本 (破坏性更新)

0.4.0 2022年7月22日
0.3.0 2022年7月22日
0.2.0 2022年7月22日
0.1.0 2022年7月22日

#7#parking-lot

每月21次 下载
cachedb 中使用

MIT/Apache

14KB
305

锁定方法的零成本抽象

'parking_lot' 提供了许多锁定变体,包括常规阻塞锁、尝试锁定、两种形式的定时尝试锁定,以及所有这些都可以作为递归变体使用。

这导致 API 变得非常庞大,在泛型代码中调度这些变体变得相当臃肿。这个 crate 将所有不同的锁定变体抽象为单个特质,具有统一的 API,该 API 接受策略对象以调度底层锁定方法

示例

// reexports parts of parking_lot as well
use parking_method::*;

let rwlock = RwLock::new(String::from("test"));

// Note the 2 following syntax forms are equivalent
assert_eq!(*Blocking.read(&rwlock).unwrap(), "test");
assert_eq!(*ReadLockMethod::read(&Blocking, &rwlock).unwrap(), "test");

assert_eq!(*TryLock.read(&rwlock).unwrap(), "test");

let timeout = Duration::from_millis(100);

assert_eq!(
    *ReadLockMethod::read(&timeout, &rwlock).unwrap(),
    "test"
);

assert_eq!(
    *ReadLockMethod::read(
        &Recursive(Instant::now() + Duration::from_millis(100)),
        &rwlock).unwrap(),
    "test"
);

依赖项

~0.4–5.5MB
~11K SLoC