23 个版本
0.4.12 | 2024 年 4 月 25 日 |
---|---|
0.4.11 | 2023 年 10 月 17 日 |
0.4.10 | 2023 年 6 月 5 日 |
0.4.9 | 2022 年 9 月 20 日 |
0.1.3 | 2018 年 6 月 18 日 |
在 并发 中排名第 371
每月下载量 11,284,330
用于 30,348 个 Crates(80 个直接使用)
185KB
3K SLoC
此库提供类型安全的完整功能的 Mutex
和 RwLock
类型,这些类型包装了简单的原始互斥锁或读写锁类型。这有几个优点:不仅消除了实现自定义锁类型的大部分工作,而且还允许用户编写与不同锁实现相关的泛型代码。
此 crate 的基本用法非常简单
- 创建原始锁类型。这应该只包含锁状态,不包含任何由锁保护的任何数据。
- 为您的自定义锁类型实现
RawMutex
特性。 - 将互斥锁导出为
lock_api::Mutex
的类型别名,并将互斥锁保护器导出为lock_api::MutexGuard
的类型别名。下面提供示例以供参考。
此过程与 RwLock
类似,但需要导出两个保护器而不是一个。(如果您的类型支持升级读锁,则为 3 个保护器,有关详细信息请参阅下面的 扩展特性)
示例
use lock_api::{RawMutex, Mutex, GuardSend};
use std::sync::atomic::{AtomicBool, Ordering};
// 1. Define our raw lock type
pub struct RawSpinlock(AtomicBool);
// 2. Implement RawMutex for this type
unsafe impl RawMutex for RawSpinlock {
const INIT: RawSpinlock = RawSpinlock(AtomicBool::new(false));
// A spinlock guard can be sent to another thread and unlocked there
type GuardMarker = GuardSend;
fn lock(&self) {
// Note: This isn't the best way of implementing a spinlock, but it
// suffices for the sake of this example.
while !self.try_lock() {}
}
fn try_lock(&self) -> bool {
self.0
.compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)
.is_ok()
}
unsafe fn unlock(&self) {
self.0.store(false, Ordering::Release);
}
}
// 3. Export the wrappers. This are the types that your users will actually use.
pub type Spinlock<T> = lock_api::Mutex<RawSpinlock, T>;
pub type SpinlockGuard<'a, T> = lock_api::MutexGuard<'a, RawSpinlock, T>;
扩展特性
除了基本的锁定和解锁功能外,您还可以通过实现额外的特性来公开您的锁类型中的附加功能。扩展功能的示例包括
- 公平解锁 (
RawMutexFair
,RawRwLockFair
) - 锁定超时 (
RawMutexTimed
,RawRwLockTimed
) - 可降级的写锁 (
RawRwLockDowngradable
) - 递归读锁 (
RawRwLockRecursive
) - 可升级读锁 (
RawRwLockUpgrade
)
如果原始锁类型实现了这些扩展特性,则 Mutex
和 RwLock
包装器将自动公开这些附加功能。
货物特性
此箱子支持三个货物特性
owning_ref
:允许您的锁类型与owning_ref
箱子一起使用。arc_lock
:启用从Arc
加锁。这使ArcMutexGuard
等类型成为可能。请注意,这需要存在alloc
箱子。
依赖关系
~205KB