lock_guard 和 unique_lock
时间: 2023-09-20 09:04:22 浏览: 149
lock_guard和unique_lock都是C++标准库中的互斥锁包装器,用于提供对共享资源的独占访问。它们有一些共同点,也有一些区别。
共同点:
1. 都是RAII(资源获取即初始化)类,用于自动管理锁的获取和释放。在创建这些对象时,它们会自动获取锁,并在离开作用域时自动释放锁。
2. 都提供了类似的接口,例如lock()和unlock()函数,用于手动控制锁的获取和释放。
区别:
1. lock_guard是一个简单的、轻量级的互斥锁包装器。它只能使用默认的锁定策略,无法手动解锁。一旦持有了lock_guard对象,就无法手动释放锁,只能等待离开作用域时自动释放。
例如:
```
std::mutex mtx;
{
std::lock_guard<std::mutex> lock(mtx); // 自动获取锁
// 对共享资源进行操作
} // 离开作用域时自动释放锁
```
2. unique_lock是一个更灵活、功能更强大的互斥锁包装器。它可以使用不同的锁定策略,并且可以手动解锁。这使得unique_lock更适合在复杂的情况下使用,比如条件变量、超时等待等。
例如:
```
std::mutex mtx;
{
std::unique_lock<std::mutex> lock(mtx); // 自动获取锁
// 对共享资源进行操作
lock.unlock(); // 手动释放锁
// 其他操作,无需持有锁
lock.lock(); // 再次获取锁
// 对共享资源进行操作
} // 离开作用域时自动释放锁
```
总的来说,lock_guard是一个简单的、自动管理锁的包装器,适用于简单的场景。而unique_lock更灵活,可以手动控制锁的获取和释放,适用于复杂的场景。
阅读全文