#lock #mutex #同步原语 #读写锁 #锁定 #无std

无std lock_api

创建具有完整功能的 Mutex 和 RwLock 类型的包装器。与无 std 兼容。

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

Download history 2334035/week @ 2024-05-02 2297670/week @ 2024-05-09 2377204/week @ 2024-05-16 2231132/week @ 2024-05-23 2439815/week @ 2024-05-30 2371627/week @ 2024-06-06 2591472/week @ 2024-06-13 2436055/week @ 2024-06-20 2339050/week @ 2024-06-27 2206350/week @ 2024-07-04 2482094/week @ 2024-07-11 2463523/week @ 2024-07-18 2486062/week @ 2024-07-25 2632994/week @ 2024-08-01 2919724/week @ 2024-08-08 2760592/week @ 2024-08-15

每月下载量 11,284,330
用于 30,348 个 Crates(80 个直接使用)

MIT/Apache

185KB
3K SLoC

此库提供类型安全的完整功能的 MutexRwLock 类型,这些类型包装了简单的原始互斥锁或读写锁类型。这有几个优点:不仅消除了实现自定义锁类型的大部分工作,而且还允许用户编写与不同锁实现相关的泛型代码。

此 crate 的基本用法非常简单

  1. 创建原始锁类型。这应该只包含锁状态,不包含任何由锁保护的任何数据。
  2. 为您的自定义锁类型实现 RawMutex 特性。
  3. 将互斥锁导出为 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>;

扩展特性

除了基本的锁定和解锁功能外,您还可以通过实现额外的特性来公开您的锁类型中的附加功能。扩展功能的示例包括

  • 公平解锁 (RawMutexFairRawRwLockFair)
  • 锁定超时 (RawMutexTimedRawRwLockTimed)
  • 可降级的写锁 (RawRwLockDowngradable)
  • 递归读锁 (RawRwLockRecursive)
  • 可升级读锁 (RawRwLockUpgrade)

如果原始锁类型实现了这些扩展特性,则 MutexRwLock 包装器将自动公开这些附加功能。

货物特性

此箱子支持三个货物特性

  • owning_ref:允许您的锁类型与 owning_ref 箱子一起使用。
  • arc_lock:启用从 Arc 加锁。这使 ArcMutexGuard 等类型成为可能。请注意,这需要存在 alloc 箱子。

依赖关系

~205KB