parking_lot 用于 Rust:快速同步原语
\n\nparking_lot 库是 Rust 语言最流行且性能最高的同步原语实现之一。它为标准互斥锁 (std::sync::Mutex)、读写锁 (std::sync::RwLock) 和条件变量 (std::sync::Condvar) 提供了替代方案,但具有显著更好的性能和更小的代码体积。
为什么需要这个库?Rust 中的标准同步原语虽然安全,但存在一些缺点:即使在简单场景下也会使用系统调用(Linux 上的 futex),需要额外的内存用于标志位,并且内部实现更复杂。parking_lot 通过使用更高效的算法(例如乐观锁和自旋循环)并最小化开销来解决这些问题。因此,代码运行得更快,尤其是在高竞争的多线程应用中。
\n\n该库与 Rust 完全兼容,并且不需要用户编写 unsafe 代码。它提供与标准库相同的接口,但具有额外功能:支持超时的 Mutex、具有公平队列的 RwLock、用于延迟初始化的 Once 以及用于可重入锁的 ReentrantMutex。parking_lot 是高性能 Rust 应用(从 Web 服务器到游戏引擎)的事实标准。
安装
\n\n将库添加到您项目的 Cargo.toml 文件中:
[dependencies]\nparking_lot = "0.12"\n\n然后执行命令:
\n\ncargo build\n\n或者,如果您使用 cargo add(从 Rust 1.62 开始):
cargo add parking_lot\n\n之后,您可以从库中导入原语:
\n\nuse parking_lot::{Mutex, RwLock, Condvar, Once, ReentrantMutex};\n\n快速入门:最小工作示例
\n\n以下是在多线程环境中使用 parking_lot 的 Mutex 保护共享计数器的简单示例:
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以下是 parking_lot 库的 8 个关键方法/类型,包含签名、描述和示例。
\n\n1. Mutex::lock()
\n签名: pub fn lock(&self) -> MutexGuard<'_, T>
描述: 获取互斥锁,阻塞当前线程直到获得锁。返回一个 RAII 守卫,该守卫在退出时自动释放锁。