基本用法
“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
常见的使用方式。根据具体的需求,可以选择不同的锁管理方法来确保线程安全。