lock_guard和unique_lock学习总结

1.std::lock_guard

std::lock_guard其实就是简单的RAII(Resource Acquisition Is Initialization)封装,资源获取即初始化。在构造函数中进行加锁,析构函数中进行解锁,这样可以保证函数退出时,锁一定被释放。

不可以对 std::lock_guard 调用 unlock 进行解锁操作。std::lock_guard 是一个非常简单的互斥量管理类,设计初衷是提供一种 RAII(资源获取即初始化)风格的锁机制,当 std::lock_guard 对象创建时锁定互斥量,并在对象销毁时析构函数里自动解锁互斥量。std::lock_guard 没有提供解锁和重新锁定 的功能。它的接口非常简单,只包含构造函数和析构函数,没有 unlocklock 方法。这使得 std::lock_guard 更加轻量级,但也更不灵活。

构造函数:

cpp 复制代码
explicit lock_guard(mutex_type& m); // 引用类型,锁定互斥量m,析构函数中解锁

// 其中mutex_type是模板参数的别名
template <class Mutex>
class lock_guard {
public:
    using mutex_type = Mutex; // 定义 mutex_type 为模板参数 Mutex
    explicit lock_guard(mutex_type& m);
    ~lock_guard();
    // ...
};

2.std::unique_lock

转自:https://www.cnblogs.com/moodlxs/p/10111843.html

std::lock_guard的功能超集, 封装了各种加锁操作,阻塞的,非阻塞的,还可以结合条件变量一起使用,基本上对锁的各种操作都封装了。所以性能和内存开销都比std::lock_guard大得多,需要有选择地使用。 std::unique_lock也会在析构的时候自动解锁,所以说,是std::lock_guard的功能超集。

支持多种加锁模式,构造函数:

cpp 复制代码
unique_lock() noexcept; // 默认构造函数创建一个不与任何互斥量相关联的 unique_lock 对象
explicit unique_lock(mutex_type& m); //创建一个与互斥量 m 相关联并立即锁定它的 unique_lock 对象,通过析构函数unlock
unique_lock( mutex_type& m, std::defer_lock_t t );   //延迟加锁,之后再调用lock()主动加锁,可以不用unlock,可以通过unique_lock的析构函数unlock
unique_lock( mutex_type& m, std::try_to_lock_t t ); //尝试加锁
unique_lock( mutex_type& m, std::adopt_lock_t t );   //马上加锁
unique_lock(unique_lock&& u) noexcept; // 移动构造函数。原来的 unique_lock 对象将不再持有互斥量。

尝试加锁例子:

cpp 复制代码
std::mutex mlock;

void work1(int& s) {
    for (int i = 1; i <= 5000; i++) {
        std::unique_lock<std::mutex> munique(mlock, std::try_to_lock);
        if (munique.owns_lock() == true) {// 判断是否加锁成功
            s += i;
        }
        else {
            // 执行一些没有共享内存的代码
        }
    }
}

延迟加锁例子:

cpp 复制代码
void work1(int& s) {
    for (int i = 1; i <= 5000; i++) {
        std::unique_lock<std::mutex> munique(mlock, std::defer_lock);
        if (munique.try_lock() == true) {// 判断当前是否能lock
            s += i;
        }
        else {
            // 处理一些没有共享内存的代码
        }
    }
}

移动构造函数例子:

cpp 复制代码
std::unique_lock<std::mutex> munique1(mlock);
std::unique_lock<std::mutex> munique2(std::move(munique1));
// 此时munique1失去mlock的权限,并指向空值,munique2获取mlock的权限
相关推荐
知识分享小能手8 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
luckys.one8 小时前
第9篇:Freqtrade量化交易之config.json 基础入门与初始化
javascript·数据库·python·mysql·算法·json·区块链
言之。9 小时前
Django中的软删除
数据库·django·sqlite
茯苓gao10 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾11 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
阿里嘎多哈基米11 小时前
SQL 层面行转列
数据库·sql·状态模式·mapper·行转列
抠脚学代码11 小时前
Ubuntu Qt x64平台搭建 arm64 编译套件
数据库·qt·ubuntu
皮皮林55111 小时前
SpringBoot 全局/局部双模式 Gzip 压缩实战:14MB GeoJSON 秒变 3MB
java·spring boot
jakeswang11 小时前
全解MySQL之死锁问题分析、事务隔离与锁机制的底层原理剖析
数据库·mysql
weixin_4569042711 小时前
Spring Boot 用户管理系统
java·spring boot·后端