C++中的鎖類型對比與實戰:std::lock_guard
、std::unique_lock
、std::shared_lock
在多線程編程中,合理地使用鎖是保證數據一致性和線程安全的關鍵。C++標準庫提供了多種鎖類型,每種都有其適用場景和性能特性。本文將深入分析 std::lock_guard
、std::unique_lock
、std::shared_lock
三者的區別、性能差異、常見誤區,并結合實際示例介紹如何選擇和使用這些鎖類型。
一、三者作用概覽
類型 | 適用于 | 支持解鎖/延遲鎖? | 支持共享鎖? | 簡單易用 | 功能全面 |
---|---|---|---|---|---|
std::lock_guard | 最簡單的互斥鎖 | ? 不支持 | ? 不支持 | ? 簡單 | ? 不靈活 |
std::unique_lock | 高級互斥鎖 | ? 支持 | ? 不支持 | 中等 | ? 靈活 |
std::shared_lock | 共享讀寫鎖(C++17) | ? 支持 | ? 支持共享讀 | 中等 | ? 靈活 |
二、詳細對比
1. std::lock_guard<Mutex>
- 作用:自動加鎖、離開作用域時自動解鎖
- 特點:簡單快速,RAII 模式
- 缺點:不支持
unlock()
、延遲鎖、try_lock()
等高級操作
std::mutex mtx;
{std::lock_guard<std::mutex> lock(mtx); // 加鎖// 臨界區
} // 自動解鎖
2. std::unique_lock<Mutex>
- 作用:靈活控制鎖的生命周期
- 特點:支持
.unlock()
、延遲鎖、try_lock()
、可移動 - 適用:復雜臨界區控制、條件變量
std::mutex mtx;// 立即加鎖
std::unique_lock<std::mutex> lock1(mtx);// 延遲加鎖
std::unique_lock<std::mutex> lock2(mtx, std::defer_lock)