在 C++ Standard Template Library (STL) 中,有幾個鎖的實現,這些都位于 <mutex>
頭文件。以下是一些常見的鎖及其功能:
- std::mutex:最基本的互斥鎖,不可遞歸使用。該鎖提供了獨占的非公平鎖定能力。
std::mutex mtx;
mtx.lock(); // 獲取鎖
// 臨界區代碼
mtx.unlock(); // 釋放鎖
- std::recursive_mutex:遞歸互斥鎖,允許同一個線程對同一個互斥體多次上鎖。
std::recursive_mutex rmtx;
rmtx.lock(); // 第一次鎖定
rmtx.lock(); // 第二次鎖定,該線程不會被阻塞
// 臨界區代碼
rmtx.unlock(); // 第一次解鎖
rmtx.unlock(); // 第二次解鎖
- std::timed_mutex:帶有超時功能的互斥鎖,允許嘗試上鎖一段時間。
std::timed_mutex tmtx;
if (tmtx.try_lock_for(std::chrono::seconds(1))) {// 獲取鎖tmtx.unlock();
}
- std::recursive_timed_mutex:遞歸和帶有超時的互斥鎖。
std::recursive_timed_mutex rtmtx;
if (rtmtx.try_lock_for(std::chrono::seconds(1))) {// 獲取鎖rtmtx.unlock();
}
- std::lock_guard:是 RAII(Resource Acquisition Is Initialization)風格的包裹器,確保鎖在作用域中被安全的獲取和釋放。
std::mutex mtx;
{std::lock_guard<std::mutex> lock(mtx);// 臨界區代碼
} // lock 自動釋放
- std::unique_lock:比
std::lock_guard
更為靈活,允許延遲鎖定、時間鎖定、重復鎖定和解鎖和轉移鎖所有權等。
std::mutex mtx;
std::unique_lock<std::mutex> ulock(mtx, std::defer_lock); // 延遲鎖定
ulock.lock(); // 顯示調用鎖定
// 臨界區代碼
ulock.unlock(); // 如果需要可以提前解鎖
- std::shared_mutex(C++17 引入):讀寫鎖,支持多個讀者(共享鎖)或單一寫者(獨占鎖)。
std::shared_mutex smtx;
{std::shared_lock<std::shared_mutex> lock(smtx); // 共享鎖// 多個線程可以同時讀取數據(非臨界區代碼)
} // 共享鎖自動釋放{std::unique_lock<std::shared_mutex> lock(smtx); // 獨占鎖// 臨界區代碼,只有一個線程可以寫數據
} // 獨占鎖自動釋放
這些鎖提供了多種不同線程同步和互斥的機制,以解決多線程程序中的競態條件和其他同步問題。開發者可以根據不同的需要選擇合適的鎖使用。