std::lock_guard<std::mutex> lock(mtx);和std::unique_lock<std::mutex> lock(mtx);的作用分别是什么?
时间: 2023-08-24 08:04:17 浏览: 223
`std::lock_guard<std::mutex>` 和 `std::unique_lock<std::mutex>` 都是用于管理互斥量的 C++ 标准库类型,但它们有一些不同之处。
`std::lock_guard<std::mutex>` 是一个轻量级的互斥量包装器,它在构造时锁住互斥量,在析构时自动释放互斥量。它的作用是确保在作用域中的代码段执行期间,互斥量一直处于锁定状态。由于 `std::lock_guard` 是在构造时锁住互斥量并在析构时释放互斥量,因此它不支持手动解锁和再次锁定。
示例代码如下:
```cpp
std::mutex mtx;
{
std::lock_guard<std::mutex> lock(mtx); // 锁住互斥量
// 在这个作用域内,互斥量一直处于锁定状态
// ...
} // 在 lock_guard 对象的析构函数中自动释放互斥量
```
`std::unique_lock<std::mutex>` 是一个更灵活的互斥量包装器。它也在构造时锁住互斥量,在析构时释放互斥量,但与 `std::lock_guard` 不同,`std::unique_lock` 允许手动解锁和再次锁定互斥量。这使得 `std::unique_lock` 在某些场景下更加灵活,例如等待条件变量满足时再次加锁、支持对互斥量进行尝试锁定等。
示例代码如下:
```cpp
std::mutex mtx;
std::unique_lock<std::mutex> lock(mtx); // 锁住互斥量
// 在这个作用域内,互斥量一直处于锁定状态
// ...
lock.unlock(); // 手动解锁互斥量
// ...
lock.lock(); // 再次锁定互斥量
// ...
lock.unlock(); // 解锁互斥量
```
综上所述,`std::lock_guard` 适用于简单的互斥量保护,而 `std::unique_lock` 更灵活,适用于需要手动解锁和再次锁定的场景,例如等待条件变量、尝试锁定等。
阅读全文