parking_lot 用于 Rust:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

parking_lot 用于 Rust:快速同步原语

\n\n

parking_lot 库是 Rust 语言最流行且性能最高的同步原语实现之一。它为标准互斥锁 (std::sync::Mutex)、读写锁 (std::sync::RwLock) 和条件变量 (std::sync::Condvar) 提供了替代方案,但具有显著更好的性能和更小的代码体积。

\n\n

为什么需要这个库?Rust 中的标准同步原语虽然安全,但存在一些缺点:即使在简单场景下也会使用系统调用(Linux 上的 futex),需要额外的内存用于标志位,并且内部实现更复杂。parking_lot 通过使用更高效的算法(例如乐观锁和自旋循环)并最小化开销来解决这些问题。因此,代码运行得更快,尤其是在高竞争的多线程应用中。

\n\n

该库与 Rust 完全兼容,并且不需要用户编写 unsafe 代码。它提供与标准库相同的接口,但具有额外功能:支持超时的 Mutex、具有公平队列的 RwLock、用于延迟初始化的 Once 以及用于可重入锁的 ReentrantMutex。parking_lot 是高性能 Rust 应用(从 Web 服务器到游戏引擎)的事实标准。

\n\n

安装

\n\n

将库添加到您项目的 Cargo.toml 文件中:

\n\n
[dependencies]\nparking_lot = "0.12"
\n\n

然后执行命令:

\n\n
cargo build
\n\n

或者,如果您使用 cargo add(从 Rust 1.62 开始):

\n\n
cargo add parking_lot
\n\n

之后,您可以从库中导入原语:

\n\n
use parking_lot::{Mutex, RwLock, Condvar, Once, ReentrantMutex};
\n\n

快速入门:最小工作示例

\n\n

以下是在多线程环境中使用 parking_lot 的 Mutex 保护共享计数器的简单示例:

\n\n
use parking_lot::Mutex;\nuse std::thread;\n\nfn main() {\n    // 创建一个包装值的互斥锁\n    let counter = Mutex::new(0);\n\n    // 创建 10 个线程,每个线程将计数器增加 1\n    let mut handles = vec![];\n    for _ in 0..10 {\n        let handle = thread::spawn(|| {\n            // 获取锁 — .lock() 返回 RAII 守卫\n            let mut guard = counter.lock();\n            *guard += 1;\n            // guard 在离开作用域时自动释放\n        });\n        handles.push(handle);\n    }\n\n    // 等待所有线程完成\n    for handle in handles {\n        handle.join().unwrap();\n    }\n\n    // 读取最终值\n    let final_value = *counter.lock();\n    println!("最终值: {}", final_value); // 应该是 10\n}
\n\n

在此示例中,counter.lock() 返回一个 MutexGuard,它在销毁时自动释放锁。与标准 std::sync::Mutex 不同,这里不需要处理错误(中毒)——parking_lot 默认情况下不会在 panic 时使互斥锁中毒。

\n\n

主要方法和类型

\n\n

以下是 parking_lot 库的 8 个关键方法/类型,包含签名、描述和示例。

\n\n

1. Mutex::lock()

\n

签名: pub fn lock(&self) -> MutexGuard<'_, T>

\n

描述: 获取互斥锁,阻塞当前线程直到获得锁。返回一个 RAII 守卫,该守卫在退出时自动释放锁。

推荐