怎么使用 std::unique_lock
时间: 2023-12-08 18:09:42 浏览: 81
std::unique_lock 是 C++11 新增的同步原语之一,用于实现线程间的互斥访问。它相比于 std::lock_guard 的优点在于其更灵活的锁定解锁方式和更多的锁类型支持。
使用 std::unique_lock 首先需要创建一个 std::mutex 对象,然后将其作为参数传入 std::unique_lock 构造函数中。接着可以使用该锁对象对需要加锁的代码进行保护,这样别的线程便不能同时进入该代码块。
示例代码如下:
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx);
// 需要被保护的代码块
std::unique_lock 还有一个值得注意的用法是可以以 defer_lock 参数来创建一个未锁定的锁对象,在需要时再手动调用 lock() 来加锁。
示例代码如下:
std::mutex mtx;
std::unique_lock<std::mutex> lck(mtx, std::defer_lock);
// 先执行一些不需要加锁的操作
lck.lock(); // 手动加锁
// 需要被保护的代码块
需要注意的是,在使用 std::unique_lock 锁定某个互斥量时,应尽可能使用 RAII(Resource Acquisition Is Initialization,资源取得即初始化)的思想,在出作用域时自动释放锁对象。即不应该手动调用 unlock()。这样可以避免在解锁时出现异常或者忘记解锁的情况。
相关问题
std::lock_guard 和std::unique_lock 使用的区别
std::lock_guard 和std::unique_lock 是在多线程编程中用于管理互斥锁的两个 C++11 提供的类。
std::lock_guard 是一个模板类,它的构造函数接收一个互斥锁作为参数,在构造时会自动调用该锁的 lock() 方法获取锁,并在析构时调用 unlock() 方法释放锁。std::lock_guard 的使用更加简单,适合在一段代码块中对互斥锁进行上锁和解锁操作。
示例代码如下:
```cpp
std::mutex mtx;
void foo()
{
std::lock_guard<std::mutex> lock(mtx); // 自动上锁
// 代码块
} // 自动解锁
```
std::unique_lock 是另一个模板类,它提供了更灵活的锁管理方式。与 std::lock_guard 不同的是,std::unique_lock 的构造函数可以接收一个互斥锁,并且可以选择锁定方式(上锁或不上锁)。它还提供了更多的成员函数,例如 unlock()、try_lock() 等。std::unique_lock 的灵活性使得它适用于更多复杂的场景,例如延迟加锁、条件变量等。
示例代码如下:
```cpp
std::mutex mtx;
void foo()
{
std::unique_lock<std::mutex> lock(mtx); // 手动上锁
// 代码块
lock.unlock(); // 手动解锁
// 其他操作
lock.lock(); // 再次上锁
// 代码块
} // 自动解锁
```
综上所述,std::lock_guard 更适合简单的互斥锁管理,而 std::unique_lock 则提供了更大的灵活性和控制权。根据具体的需求和场景选择适合的类来管理互斥锁。
std::unique_lock<std::mutex> lock
std::unique_lock<std::mutex> lock 是在C++中使用std::unique_lock对std::mutex进行加锁的方法。它提供了比std::lock_guard更高级的功能。
以下是一个示例代码:
```cpp
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mutex_;
void threadFunction()
{
std::unique_lock<std::mutex> lock(mutex_);
// 在这里执行需要保护的代码
std::cout << "线程已获得锁" << std::endl;
// ...
std::cout << "线程释放锁" << std::endl;
}
int main()
{
std::thread t1(threadFunction);
std::thread t2(threadFunction);
t1.join();
t2.join();
return 0;
}
```
在上面的示例中,我们创建了两个线程t1和t2,并且它们都会执行threadFunction函数。在threadFunction函数中,我们使用std::unique_lock<std::mutex> lock(mutex_)来锁定互斥量mutex_,以确保同一时间只有一个线程能够访问被保护的代码。当一个线程获得锁时,其他线程将被阻塞,直到锁被释放。
阅读全文