在 C++ 中,互斥量(std::mutex
)是一種用于多線程編程中保護共享資源的機制,防止多個線程同時訪問某個資源,從而避免數據競爭(data race)和不一致的問題。
🔒 一、基礎用法:std::mutex
頭文件:#include <mutex>
#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx; // 創建一個互斥量
int counter = 0;void increment(int id) {for (int i = 0; i < 10000; ++i) {mtx.lock(); // 加鎖++counter; // 訪問共享資源mtx.unlock(); // 解鎖}
}
你可以通過多個線程調用 increment()
,互斥量保證了線程安全。
? 更推薦的方式:使用 std::lock_guard
它是一種 RAII(資源獲取即初始化) 的封裝類,作用域結束時會自動解鎖,非常安全,防止漏解鎖。
void increment(int id) {for (int i = 0; i < 10000; ++i) {std::lock_guard<std::mutex> lock(mtx);++counter;} // 作用域結束時自動釋放鎖
}
? 錯誤示例(不要這樣做):
mtx.lock();
++counter;
// 如果中間拋異常,mutex 可能永遠不會 unlock
🧠 其他互斥量類型
類型 | 說明 |
---|---|
std::mutex | 最基本的互斥量 |
std::recursive_mutex | 支持同一線程多次加鎖 |
std::timed_mutex | 支持帶超時的鎖操作 |
std::shared_mutex | C++17,引入讀寫鎖(多個讀一個寫) |
🧪 示例:多個線程安全地寫輸出
#include <iostream>
#include <thread>
#include <mutex>std::mutex print_mtx;void safe_print(const std::string& msg) {std::lock_guard<std::mutex> lock(print_mtx);std::cout << msg << std::endl;
}int main() {std::thread t1(safe_print, "hello from thread 1");std::thread t2(safe_print, "hello from thread 2");t1.join();t2.join();return 0;
}
? try_lock()
與 timed_mutex
if (mtx.try_lock()) {// 成功獲得鎖mtx.unlock();
} else {// 沒拿到鎖,干別的事
}
std::timed_mutex tmtx;
if (tmtx.try_lock_for(std::chrono::milliseconds(100))) {// 拿到鎖tmtx.unlock();
}
總結:
方法 | 是否推薦 | 用法說明 |
---|---|---|
mutex.lock()/unlock() | ? 不推薦(容易忘記 unlock) | |
std::lock_guard | ? 推薦,簡單安全 | |
std::unique_lock | ? 推薦,需要更靈活控制時 | |
try_lock / timed_mutex | ? 用于嘗試加鎖或有時間要求 |
如你需要我幫你寫一個完整的多線程例子(比如生產者-消費者模型、線程池、文件讀寫等),可以直接告訴我場景!