当前位置: 首页 > news >正文

Android常用C++特性之std::lock_guard

声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。

std::lock_guard 是 C++ 标准库中的一个简单 RAII(Resource Acquisition Is Initialization)风格的互斥锁管理类。它用于在作用域内自动管理互斥锁(std::mutex),确保在作用域结束时互斥锁能够自动释放,从而避免手动加锁/解锁带来的风险(如死锁或忘记解锁等问题)。

基本用法

当使用 std::lock_guard 对互斥锁进行管理时:

  • 在创建 std::lock_guard 对象时,会自动锁住互斥锁。
  • std::lock_guard 对象销毁(通常是在作用域结束时)时,会自动解锁互斥锁。

语法

std::lock_guard<std::mutex> lock(mutex);
  • mutexstd::mutex 类型的互斥锁,std::lock_guard 会在作用域内锁住它,并在作用域结束时自动解锁。

示例

1. 使用 std::lock_guard 来保护共享数据
#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;  // 定义互斥锁
int sharedData = 0;void increment() {for (int i = 0; i < 1000; ++i) {// 使用 lock_guard 锁住互斥锁,作用域结束时自动解锁std::lock_guard<std::mutex> lock(mtx);++sharedData;}
}int main() {std::thread t1(increment);std::thread t2(increment);t1.join();t2.join();std::cout << "Final value of sharedData: " << sharedData << std::endl;  // 输出: 2000return 0;
}
2. 防止忘记解锁

使用手动 lock()unlock() 进行加锁和解锁时,可能会因为逻辑复杂导致解锁步骤被遗漏或在异常处理中忘记解锁。而 std::lock_guard 可以确保互斥锁在作用域结束时自动解锁,无论是正常结束还是因为异常提前退出。

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void safePrint(const std::string& message) {// 使用 lock_guard 保证在作用域内锁住互斥锁std::lock_guard<std::mutex> lock(mtx);std::cout << message << std::endl;
}int main() {std::thread t1(safePrint, "Thread 1 is running");std::thread t2(safePrint, "Thread 2 is running");t1.join();t2.join();return 0;
}
3. RAII(资源获取即初始化)

std::lock_guard 的最大优势在于它遵循 RAII 原则,确保了加锁和解锁的安全性,防止因为程序中异常或忘记解锁而引发的死锁问题。

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void workWithLockGuard() {std::lock_guard<std::mutex> lock(mtx); // 自动加锁std::cout << "Working with lock_guard!" << std::endl;// 代码块结束时自动解锁
}int main() {std::thread t1(workWithLockGuard);std::thread t2(workWithLockGuard);t1.join();t2.join();return 0;
}

std::lock_guardstd::unique_lock 的区别

  • std::lock_guard 是一个轻量的互斥锁管理类,锁住互斥锁后会一直保持锁定,直到其作用域结束,解锁没有任何延迟或解锁前条件控制。
  • std::unique_lock 提供了更多的灵活性,如:
    • 可以手动控制加锁和解锁。
    • 可以使用 try_lock 尝试锁定。
    • 可以延迟加锁或提前解锁。
    • 可以与条件变量 (std::condition_variable) 一起使用。

如果你需要一个简单的、作用域内自动加锁/解锁的机制,std::lock_guard 是一个很好用的工具。如果你需要更复杂的锁管理,如延迟加锁或条件变量同步,则可以使用 std::unique_lock

总结

  • std::lock_guard 提供了一种简单且安全的机制来管理互斥锁,自动加锁和解锁,防止手动管理时的各种问题(如死锁、忘记解锁)。
  • 适合在简单场景中使用,主要用于确保在作用域结束时互斥锁能够安全释放。

相关文章:

  • Spring自动装配的5种方式
  • Android中大量使用建造者模式(Builder Pattern)的原因可以归结为以下几点:
  • 【华为HCIP实战课程三】动态路由OSPF的NBMA环境建立邻居及排错,网络工程师
  • [Linux]僵尸进程,孤儿进程,环境变量
  • NGINX+LUA编译安装
  • 关于Obj文件格式介绍与Unity加载Obj文件代码参考
  • 9.24作业
  • vue实现左侧数据拖拽到右侧区域,且左侧数据保留且左侧数据不能互相拖拽改变顺序
  • 注册中心Eureka
  • 面试-2024年9月13号
  • I2C通信中的当前地址指针(CADDR)工作原理
  • 【韩顺平Java笔记】第3章:变量
  • Spring Boot 配置全流程 总结
  • 【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
  • 51单片机和ARM单片机的区别
  • [LeetCode] Wiggle Sort
  • 10个最佳ES6特性 ES7与ES8的特性
  • gcc介绍及安装
  • golang 发送GET和POST示例
  • Java超时控制的实现
  • Python - 闭包Closure
  • Python连接Oracle
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 盘点那些不知名却常用的 Git 操作
  • 如何设计一个微型分布式架构?
  • 使用 Docker 部署 Spring Boot项目
  • 为视图添加丝滑的水波纹
  • 优秀架构师必须掌握的架构思维
  • ionic异常记录
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • (007)XHTML文档之标题——h1~h6
  • (07)Hive——窗口函数详解
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (十六)视图变换 正交投影 透视投影
  • (贪心 + 双指针) LeetCode 455. 分发饼干
  • (原創) 物件導向與老子思想 (OO)
  • (转)jQuery 基础
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .Family_物联网
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 8.0 中有哪些新的变化?
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NetCore 如何动态路由
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • 。。。。。
  • ::什么意思
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • [AIGC] 深入浅出 Python中的`enumerate`函数
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [BJDCTF2020]EzPHP1
  • [HNOI2006]鬼谷子的钱袋
  • [LeetCode] 197. 上升的温度