std::lock_guard 和std::unique_lock 使用的区别
时间: 2023-12-08 07:07:33 浏览: 223
C++11多线程加锁方式.doc
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 则提供了更大的灵活性和控制权。根据具体的需求和场景选择适合的类来管理互斥锁。
阅读全文