C++ 锁管理:std::lock_guard 和 std::unique_lock 使用方法

1、std::lock_guard

概述:

  • std::lock_guard 是一种简单的锁管理工具,用于自动化地加锁和解锁互斥量。
  • 适用于需要简单、明确的锁定和解锁场景。

特点:

  • 自动加锁:在构造时自动锁定互斥量。
  • 自动解锁:在析构时自动释放锁。
  • 不可手动解锁:不支持手动解锁或重新加锁。
  • 性能开销小:由于功能简单,性能开销较小。

适用场景:

  • 当锁定范围非常明确且简单,如在函数的起始和结束处保护一个共享资源。
  • 当不需要在同一作用域内进行手动解锁或重新加锁操作时。

示例代码:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;
int counter = 0;

void increment() {
    std::lock_guard<std::mutex> lock(mtx); // 自动加锁
    ++counter;
    std::cout << "Counter: " << counter << std::endl;
    // 自动解锁在 lock 离开作用域时
}

int main() {
    std::thread t1(increment);
    std::thread t2(increment);

    t1.join();
    t2.join();

    return 0;
}

2、std::unique_lock

概述:

  • std::unique_lock 提供了比 std::lock_guard 更多的功能和灵活性。
  • 适用于需要更复杂控制的锁定和解锁场景,如与条件变量配合使用。

特点:

  • 手动解锁:支持手动调用 unlock() 方法释放锁。
  • 重新加锁:支持在手动解锁后重新调用 lock() 方法加锁。
  • 延迟锁定:可以在构造时选择不立即锁定(使用 std::defer_lock 参数)。
  • 与条件变量配合使用:可以与 std::condition_variable 一起使用来实现等待和通知机制。
  • 性能开销:由于提供了更多功能,相比 std::lock_guard 性能开销略大。

适用场景:

  • 当需要在同一作用域内手动释放锁,或者需要在不同的作用域中重新加锁时。
  • 当需要与 std::condition_variable 一起使用以实现线程的等待和通知机制时。
  • 当锁定范围不够明确,需要更灵活的锁控制时。

示例代码:

手动解锁和重新加锁:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mtx;
int counter = 0;

void increment() {
    std::unique_lock<std::mutex> lock(mtx);
    ++counter;
    std::cout << "Counter: " << counter << std::endl;
    
    lock.unlock(); // 手动解锁

    // 在这里进行不需要锁的操作
    std::this_thread::sleep_for(std::chrono::seconds(1));
    
    lock.lock(); // 重新加锁
    ++counter;
    std::cout << "Counter after re-lock: " << counter << std::endl;
}

int main() {
    std::thread t1(increment);
    std::thread t2(increment);

    t1.join();
    t2.join();

    return 0;
}

与条件变量配合使用:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void waiting_thread() {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return ready; }); // 与条件变量配合使用
    std::cout << "Condition met!" << std::endl;
}

void signaling_thread() {
    {
        std::unique_lock<std::mutex> lock(mtx);
        ready = true;
    } // 手动解锁在这里完成
    cv.notify_one(); // 通知等待的线程
}

int main() {
    std::thread w_thread(waiting_thread);
    std::thread s_thread(signaling_thread);

    w_thread.join();
    s_thread.join();

    return 0;
}

3、总结

  • std::lock_guard:适用于简单的自动化锁定和解锁场景,功能有限但性能开销小。
  • std::unique_lock:适用于需要更复杂控制的场景,例如手动解锁、重新加锁及与条件变量配合使用,提供了更多的灵活性,但性能开销较大。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/774518.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Quantlab5.0:一切围绕可实盘策略驱动开发

原创文章第573篇&#xff0c;专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 2024年上半年即将结束&#xff0c;开始准备星球下半年的工作。 目前设想的——Quantlab5.0&#xff0c;之所以升级一个大版本&#xff0c;与4.x有很大不同。 5.0专注策略开发&…

高效任务分配的常见7步法

高效的任务分配有助于优化资源配置&#xff0c;提升开发效率与质量&#xff0c;降低成本和项目风险&#xff0c;最终提高客户满意度。如果任务分配不合理&#xff0c;可能导致资源浪费&#xff0c;造成项目延期和成本超支&#xff0c;影响工作质量&#xff0c;增加项目风险。 因…

小超市进销存软件永久免费版,免费使用!

在快节奏的商业环境中&#xff0c;小超市的管理效率直接关系到经营成本和盈利空间&#xff0c;为了帮助广大中小超市业主解决进销存管理的难题&#xff0c;象过河软件推出小超市进销存软件永久免费版&#xff0c;可让超市管理者长期免费使用。 象过河开发的小超市进销存软件专为…

谷粒商城学习-07-虚拟机网络设置

文章目录 一&#xff0c;找到配置文件Vagrantfile二&#xff0c;查询虚拟机网卡地址1&#xff0c;查看虚拟机网络配置2&#xff0c;查看宿主机网络配置 三&#xff0c;修改配置文件下的IP配置四&#xff0c;重新启动虚拟机即可生效五&#xff0c;Vagrantfile 的作用1&#xff0…

渲染农场渲染真的很贵吗?如何正确使用云渲染农场?

作为渲染行业主流的技术服务“渲染农场"&#xff0c;一直都是备受大家关注&#xff0c;渲染农场最核心的在于充足的计算机算力&#xff0c;结合3D软件支持多台机器渲染的特点&#xff0c;租用渲染农场的机器帮助你快速的解决你的渲染项目。 虽然说渲染农场需要支付一定的…

【电子数据取证】LX-A603互联网取证系统

文章关键词&#xff1a;电子数据取证、网站取证、快速固证 LX-A603可以通过简单的操作步骤&#xff0c;实现在符合规范的情况下自动对网站进行快速镜像、截屏固定、屏幕录像、生成报告等功能。满足了对互联网网站取证的实战化需求&#xff0c;极大提升工作效率。 应用场景1&a…

打包 最新血液净化器制作技术和资料

网盘 https://pan.baidu.com/s/1fm3LF20dCvy4iSMQklHpug?pwd4je2 便携可穿戴可血液净化用器件及其制备方法和应用.pdf 基于贻贝仿生化学的血液净化材料及其制备方法.pdf 膜分离式一体化血液净化系统.pdf 血液净化器固定夹.pdf 血液净化膜及其制备方法和应用.pdf 评估血液净化…

烟台LP-SCADA系统如何实现实时监控和过程控制?

关键字:LP-SCADA系统, 传感器可视化, 设备可视化, 独立SPC系统, 智能仪表系统,SPC可视化,独立SPC系统 LP-SCADA&#xff08;监控控制与数据采集&#xff09;系统实现实时监控和过程控制的主要原理和组件如下&#xff1a; 数据采集&#xff1a;LP-SCADA系统通过部署在现场的传…

STL vector 手写--迭代器设计思想、空间配置器思想!两个面试题

STL空间配置器 空间配置器的核心功能就是把对象的内存开辟和对象构造的过程分解开&#xff0c;对象析构和内存释放的过程分解开&#xff0c;因此空间配置器主要提供了以下四个函数&#xff1a; 空间配置器的函数功能allocate负责开辟内存deallocate负责释放内存construct负责…

一键直达:2024最新Win10系统安装包!快来下载!

对于想体验Win10系统最新功能的用户来说&#xff0c;寻找可靠的最新系统安装包是特别重要的。接下来系统之家小编就给大家带来2024年最新Win10系统安装包&#xff0c;有需要的小伙伴一键点击就能开始下载。该系统安装步骤简单易懂&#xff0c;无需担心任何装机经验。 推荐下载&…

快递物流运输中的RFID智能锁控应用方案

一、物流货运管理的痛点分析 1.1 货物安全与监控难题 物流货运过程中&#xff0c;货物安全是首要关注的问题。传统的锁控方式存在诸多不足&#xff0c;例如易被撬锁、监控盲点以及难以实时追踪货物状态。据统计&#xff0c;每年因货物丢失或损坏导致的经济损失高达数十亿美元…

景区智能厕所系统,打造智能化,人性化公共空间

在智慧旅游的大潮中&#xff0c;景区智能厕所系统正逐渐成为提升公共空间智能化、人性化水平的关键载体。作为智慧城市建设的重要组成部分&#xff0c;智能厕所系统不仅解决了传统公厕存在的诸多问题&#xff0c;更通过科技的力量&#xff0c;为游客创造了更加舒适、便捷的如厕…

中电金信:加快企业 AI 平台升级,构建金融智能业务新引擎

在当今数字化时代的浪潮下&#xff0c;人工智能&#xff08;AI&#xff09;技术的蓬勃发展正为各行业带来前所未有的变革与创新契机。尤其是在金融领域&#xff0c;AI 模型的广泛应用已然成为提升竞争力、优化业务流程以及实现智能化转型的关键驱动力。然而&#xff0c;企业在积…

Zabbix 配置 VMware 监控

Zabbix监控VMware 官方文档&#xff1a;https://www.zabbix.com/documentation/current/en/manual/vm_monitoring Zabbix 可以使用低级发现规则自动发现 VMware 虚拟机管理程序和虚拟机&#xff0c;并根据预定义的主机原型创建主机来监控它们。Zabbix 还包括用于监控 VMware …

缓存与数据库数据一致性问题

在用了redis缓存的系统中&#xff0c;正常情况下&#xff0c;一个读操作会先查缓存&#xff0c;如果在缓存中查到了&#xff0c;则直接返回&#xff0c;如果缓存中没有&#xff0c;则会查数据库&#xff0c;再将查到的数据写到redis中&#xff0c;然后返回。如下图&#xff1a;…

PDI-kettle工具连接本地虚拟机Ubuntu上的数据库

PDI 配置ubuntu数据库配置Kettle工具 PDI版本&#xff1a;9.4 Ubuntu2204&#xff1a;10.11.8-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04 配置ubuntu数据库 安装 apt install -y mariadb-server配置监听地址 cat > /etc/mysql/mariadb.conf.d/99-kettle.cnf << EOF …

国衍科技——梅雨季节文物保护专家

尊敬的文物保护者们 随着梅雨季节的脚步渐近&#xff0c;湿润的空气和连绵的雨水不仅为我们的生活带来了不便&#xff0c;更为文物保护工作带来了严峻的挑战。在这个季节&#xff0c;文物发霉的风险急剧上升&#xff0c;每一件珍贵的文化遗产都面临着被时间侵蚀的威胁。然而&am…

玩转内网穿透详细教程,收藏这一篇就够了

小朋友&#xff0c;你是否有过以下这些烦恼&#xff1f; 当你在外地&#xff0c;苦于无法拿到存储在家里的资料&#xff1b; 当你在玩游戏的时候&#xff0c;苦于无法和朋友直接联机&#xff1b; 当你在家里&#xff0c;苦于无法通过自己的电脑连上公司电脑远程办公&#xf…

WPF在.NET9中的重大更新:Windows 11 主题

在2023年的2月20日&#xff0c;在WPF的讨论区&#xff0c;WPF团队对路线的优先级发起了一次讨论。 对三个事项发起了投票。 第一个是Windows 11 主题 第二个是更新的控件 第三个是可空性注释 最终Windows 11 主题得票最高&#xff0c;WPF团队2023-2024的工作优先级就是Windows…

VUE3使用antd引入百度地图 实现位置查询,获取地址经纬度

实现效果: 1.index.html 中先引入下 <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=自己申请的key"></script> 申请密钥key地址:登录百度账号 注册登录后创建应用,根据自己需求选择 2.新建bmp.js文件…