【C++多线程编程】(十)之 lock_guard与unique_lock的区别
2023-12-25 13:44:53
std::lock_guard
- 自动上锁和解锁:
std::lock_guard
是一个轻量级的 RAII(资源获取即初始化)风格的类,它在构造时自动上锁,而在析构时自动解锁。一旦std::lock_guard
对象被创建,它就会自动锁住互斥量,并在其作用域结束时释放锁。不能中途解锁,必须等作用域结束才解锁。 - 适用于简单场景: 适用于对互斥量进行独占式访问的简单场景。因为
std::lock_guard
的灵活性相对较低,适用于那些在进入临界区时就要锁住,且在退出临界区时就要解锁的场景。
#include <mutex>
std::mutex myMutex;
void someFunction()
{
std::lock_guard<std::mutex> lock(myMutex); // 自动上锁
// 在这里进行对共享资源的访问或修改
} // lock_guard 在这里离开作用域,自动释放锁
std::unique_lock
-
手动上锁和解锁:
std::unique_lock
提供了更灵活的上锁和解锁方式。它在构造时可以选择是否上锁,而在析构时会根据构造时的状态决定是否解锁。这种方式允许在锁住的期间手动解锁,并在需要时手动重新上锁,提供了更大的灵活性。 -
适用于复杂场景: 适用于需要在进入临界区时锁住互斥量,但在一些条件下可能需要提前解锁,然后重新锁定互斥量的复杂场景。
#include <mutex>
std::mutex myMutex;
void someFunction()
{
std::unique_lock<std::mutex> lock(myMutex); // 手动上锁
// 在这里进行对共享资源的访问或修改
lock.unlock(); // 手动解锁
// 在这里执行一些不需要互斥量保护的操作
lock.lock(); // 手动重新锁定
// 在这里继续进行对共享资源的访问或修改
} // unique_lock 在这里离开作用域,根据情况自动或手动释放锁
所有 lock_guard 能够做到的事情,都可以使用 unique_lock 做到,反之则不然。那么何时使lock_guard呢?很简单,需要使用锁的时候,首先考虑使用 lock_guard,因为lock_guard是最简单的锁。
文章来源:https://blog.csdn.net/qq_54199287/article/details/135159240
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!