1.概要
std::unique_lock
2.内容
std::unique_lock
是 C++ 标准库中的一个同步原语,它提供了对互斥锁(mutex)的独占所有权。与 std::lock_guard
类似,std::unique_lock
也用于管理互斥锁的生命周期,但它提供了更多的灵活性和功能。
主要特点和用法
-
灵活性:与
std::lock_guard
只能在构造时锁定互斥锁并在析构时解锁不同,std::unique_lock
允许在构造后锁定和解锁互斥锁。这意味着你可以在程序的多个点控制锁的状态。 -
条件变量支持:
std::unique_lock
常与条件变量(std::condition_variable
)一起使用,因为它提供了锁定和解锁的能力,这是条件变量等待和通知机制所必需的。 -
超时锁定:
std::unique_lock
还可以尝试在一定时间内获取锁,如果在这段时间内无法获取锁,它将放弃尝试。这是通过try_lock_for
或try_lock_until
方法实现的。 -
延迟初始化:你可以创建一个未与任何互斥锁关联的
std::unique_lock
对象,然后在需要时将其与特定的互斥锁关联并锁定。
基本用法
#include <mutex>
#include <iostream>
#include <thread>
std::mutex mtx;
void print_thread_id(int id) {
// 创建一个 unique_lock,并在构造时锁定 mtx
std::unique_lock<std::mutex> lock(mtx);
// 在锁的保护下执行代码
std::cout << "线程 " << id << std::endl;
// unique_lock 的析构函数会自动解锁
}
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::mutex> lock(mtx);
在构造时锁定了互斥锁 mtx
,并在其析构时自动解锁,确保了线程安全的打印操作。
高级用法
std::unique_lock<std::mutex> lock(mtx, std::defer_lock);
// 在需要时锁定
lock.lock();
// 执行一些操作
// 显式解锁
lock.unlock();
在这个高级用法中,std::defer_lock
参数指示 std::unique_lock
在构造时不锁定互斥锁。然后,你可以在代码的适当位置调用 lock.lock()
和 lock.unlock()
来控制锁的状态。
总之,std::unique_lock
提供了一个灵活且强大的方式来管理互斥锁的生命周期,是编写多线程程序时的一个重要工具。
3.关联链接
std::future和std::promise-优快云博客
gnome-session-properties-优快云博客