## std::Mutex vs. parking_lot::Mutex:深入分析与决策指南
团队考虑从 Rust 的标准 `std::sync::Mutex` 切换到 `parking_lot::Mutex`,从而引发了对两者性能差异的深入调查。 尽管初步搜索结果偏向 `parking_lot`,但作者希望更深入地理解,因此对两种实现方式进行了详细检查,并进行了大量的基准测试。
`std::Mutex` 使用平台特定的实现(通常是 Futex),并采用内核管理的队列,优先考虑吞吐量。 然而,在高度竞争的情况下,这可能导致线程饥饿。 另一方面,`parking_lot::Mutex` 在所有平台上使用单一算法和用户空间队列,优先考虑公平性和可预测性。 它通过更小的内存占用(始终为 1 字节)和公平定时器(防止无限期锁定)来实现这一点。
在各种场景下的基准测试表明,`std::Mutex` 在低到中等竞争和短临界区中表现出色。 然而,`parking_lot::Mutex` 在高竞争、突发工作负载以及存在潜在锁垄断的场景中表现出卓越的性能,提供更稳定的等待时间并防止线程饥饿。
**选择 `std::Mutex` 的时机:** 需要零依赖项,竞争较低,需要用于调试的毒化(poisoning),或平台特定优化至关重要。 **选择 `parking_lot::Mutex` 的时机:** 公平性至关重要,可预测的行为至关重要,内存占用很重要,或存在锁垄断的风险。
最终,选择取决于应用程序的特定需求——吞吐量与公平性和可预测性。