基本用法
“mutex”是“mutual exclusion”的縮寫,意思是互斥鎖。互斥鎖用于多線程編程中,以確保同一時間只有一個線程能夠訪問某一共享資源,從而避免數據競爭和不一致性。
std::mutex是最基本的互斥鎖,用于保護共享數據。它有兩個主要操作:lock和unlock。
#include <iostream>
#include <mutex>
#include <thread>std::mutex mtx;void print_thread_id(int id) {mtx.lock(); // 鎖定互斥量std::cout << "Thread #" << id << std::endl;mtx.unlock(); // 解鎖互斥量
}int main() {std::thread threads[10];for (int i = 0; i < 10; ++i) {threads[i] = std::thread(print_thread_id, i);}for (auto &th : threads) {th.join();}return 0;
}
使用 std::lock_guard
std::lock_guard
是一種 RAII 機制,用于在作用域內自動管理互斥量的鎖定和解鎖:
#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void print_thread_id(int id) {std::lock_guard<std::mutex> guard(mtx);std::cout << "Thread #" << id << std::endl;
}int main() {std::thread t1(print_thread_id, 1);std::thread t2(print_thread_id, 2);t1.join();t2.join();return 0;
}
使用 std::unique_lock
std::unique_lock
提供了比 std::lock_guard
更靈活的鎖管理功能,例如延遲鎖定、提前解鎖和嘗試鎖定:
#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void print_thread_id(int id) {std::unique_lock<std::mutex> lock(mtx);std::cout << "Thread #" << id << std::endl;// lock.unlock(); // 提前解鎖
}int main() {std::thread t1(print_thread_id, 1);std::thread t2(print_thread_id, 2);t1.join();t2.join();return 0;
}
使用 std::try_lock
std::try_lock
可以嘗試鎖定互斥量,如果互斥量已經被鎖定,則不會阻塞線程:
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>std::mutex mtx;void print_thread_id(int id) {if (mtx.try_lock()) {std::cout << "Thread #" << id << " acquired the lock" << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));mtx.unlock();} else {std::cout << "Thread #" << id << " failed to acquire the lock" << std::endl;}
}int main() {std::thread t1(print_thread_id, 1);std::thread t2(print_thread_id, 2);t1.join();t2.join();return 0;
}
這些是 std::mutex
常見的使用方式。根據具體的需求,可以選擇不同的鎖管理方法來確保線程安全。