【C++】C++ 锁(std::mutex)的使用及其使用

在C++中,锁是一种同步机制,用于保护共享资源在多线程环境下的访问安全,防止因并发访问导致的数据不一致、竞态条件等问题。

以下是对C++中锁相关概念、类型以及使用方法的详细介绍:

1. 互斥锁(Mutex)

互斥锁(std::mutex)是最基础也是最常用的锁类型。它确保在同一时刻,最多只有一个线程能够获得锁并访问受保护的资源。当一个线程持有互斥锁时,其他尝试获取该锁的线程将被阻塞,直到锁被释放。

基本操作

  • 锁住(Locking):使用std::mutex::lock()方法获取锁。如果锁不可用(即已被其他线程持有),调用线程将被阻塞,直到锁变为可用。
  • 解锁(Unlocking):使用std::mutex::unlock()方法释放锁,使得等待的线程有机会获取锁并继续执行。
std::mutex mtx;
int shared_data = 0;void thread_function() {std::lock_guard<std::mutex> lock(mtx); // 自动锁住和解锁shared_data++; // 受保护的操作
}

2. 锁的智能指针封装(常用)

为了避免忘记解锁而导致死锁,通常建议使用RAII(Resource Acquisition Is Initialization)机制来管理锁的生命周期。C++标准库为此提供了两种智能指针式的封装:

  • std::lock_guard:在构造时自动获取锁,在析构时自动释放锁。适用于函数或代码块内部,确保锁在作用域结束时正确释放。

  • std::unique_lock:比std::lock_guard更灵活,除了具备自动锁住和解锁的功能外,还支持:

    • 手动控制锁的获取和释放。
    • 非阻塞尝试锁定(try_lock())和定时尝试锁定(try_lock_for()、try_lock_until())。
    • 支持锁的转让(移动构造和赋值)。
std::mutex mtx;
int shared_data = 0;void thread_function() {std::unique_lock<std::mutex> lock(mtx);if (some_condition) {lock.unlock(); // 手动释放锁// ... 其他操作 ...}shared_data++; // 受保护的操作
}

3. 递归锁(Recursive Mutex)

递归锁(std::recursive_mutex)允许同一线程多次获取同一个锁而不阻塞自己。这种锁适用于需要在已经持有锁的代码内部再次访问相同锁的情况。每次成功获取锁都会增加锁的递归计数,解锁时递归计数减一,直到计数降为零时锁才真正释放给其他线程。

std::recursive_mutex rmtx;
int shared_data = 0;void recursive_function() {std::lock_guard<std::recursive_mutex> lock(rmtx);shared_data++; // 第一次获取锁recursive_function(); // 再次调用自己,不会阻塞,递归计数增加
} /

4. 条件变量(Condition Variables)

条件变量(std::condition_variable)与互斥锁配合使用,用于线程间的同步。它们允许线程在满足特定条件之前等待,或者通知其他线程某个条件已变为真。

td::mutex mtx;
std::condition_variable cv;
bool data_ready = false;void producer_thread() {std::unique_lock<std::mutex> lock(mtx);// ... 生产数据 ...data_ready = true;cv.notify_one(); // 通知等待的消费者线程
}void consumer_thread() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [] { return data_ready; }); // 等待数据准备就绪// ... 消费数据 ...
}

5. 其他锁机制

  • 读写锁(std::shared_mutex / std::shared_timed_mutex):允许多个读取者同时访问资源,但同一时间只允许一个写入者。提高了读多写少场景下的并发性能。
  • 原子操作(std::atomic):对于简单数据类型的同步访问,可以使用原子操作代替锁,提供轻量级的无锁同步。

## 最佳实践

  • 最小化临界区:尽可能缩小锁保护的代码范围,以减少锁的竞争和持有时间。
  • 避免死锁:合理安排锁的获取顺序,避免循环等待;避免在持有锁时进行可能会阻塞的操作(如IO、其他锁的获取等)。
  • 使用智能指针管理锁:优先使用std::lock_guard或std::unique_lock确保锁的正确释放。
  • 考虑锁的粒度:根据实际情况选择合适的锁类型和粒度,如使用细粒度锁提高并发性,或使用粗粒度锁简化同步逻辑。

C++提供了丰富的锁机制来应对多线程编程中的同步需求,通过合理选择和使用这些工具

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【进阶六】Python实现SDVRPTW(需求拆分)常见求解算法——禁忌搜索+模拟退火算法(TS+SA)

基于python语言&#xff0c;采用经典禁忌搜索&#xff08;TS&#xff09;模拟退火&#xff08;SA&#xff09;对 带硬时间窗的需求拆分车辆路径规划问题&#xff08;SDVRPTW&#xff09; 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时…

EureKa技术解析:科技行业的革新风暴(ai写作)

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

如何驱动消费者自我裂变,助力平台引流与卖货双重提升

大家好&#xff0c;我是微三云周丽 在浩瀚的商业海洋中&#xff0c;电商行业一直以其独特的魅力和无限的可能性吸引着众多创业者和投资者的目光。近年来&#xff0c;一种被誉为电商模式中的“神盘”——众筹卖货模式&#xff0c;正悄然崭露头角&#xff0c;以其独特的运作方式…

Docker 入门篇(二)-- Linux 环境离线安装

引言 docker 系列文章&#xff1a; Docker 入门篇&#xff08;一&#xff09;-- 简介与安装教程&#xff08;Windows和Linux&#xff09; 一、安装环境准备 centos &#xff1a;CentOS Linux release 7.6.1810 (Core)docker 版本&#xff1a;docker-26.1.0.tgz 官网下载地址…

【RAG 论文】Chain-of-Note:为 RAG 引入 CoT 让模型生成阅读笔记来提高面对噪音文档和未知场景的鲁棒性

论文&#xff1a;Chain-of-Note: Enhancing Robustness in Retrieval-Augmented Language Models ⭐⭐⭐ Tencent AI Lab, arXiv:2311.09210 文章目录 一、论文速读二、实现的细节2.1 Note Design2.2 Data Collection2.3 Model Training 三、实验结果3.1 QA Performance3.2 对 …

虚拟机VMware下ROS Neotic(Ubuntu 20.04)下安装OpenCV

一、ROS安装 ROS的官方安装步骤&#xff1a; 1、noetic / Ubuntu 20.04 &#xff1a; http://wiki.ros.org/noetic/Installation/Ubuntu 2、melodic / Ubuntu 18.04&#xff1a; http://wiki.ros.org/melodic/Installation/Ubuntu 3、kinetic / Ubuntu 16.04&#xff1a; http:…

第三节课,后端登录【1】.2--本人

一、视频链接 网址&#xff1a; 后端用户脱敏和session-CSDN直播 二、代码开始 2.1 新建一个request参数。完成用户登录态键 快捷建&#xff0c; 全局变量 代码&#xff1a; // 3.记录用户的登录态/*** 这段代码是Java Web开发中的一部分&#xff0c;用于在会话&#xff08…

【目标检测】FPN特征金字塔完整流程详解

学习视频&#xff1a;1.1.2 FPN结构详解 对比 可以看到FPN是自上而下、自下而上并且可以进行多尺度特征融合的的层级结构。 具体结构 1x1 conv: 对通道数进行调整&#xff0c;不同大小的特征图通道数不同&#xff0c;越高层次的特征图通道数越大&#xff0c;论文中使用256个1…

ChatGPT/GLM API使用

模型幻觉问题 在自然语言处理领域&#xff0c;幻觉&#xff08;Hallucination&#xff09;被定义为生成的内容与提供的源内容无关或不忠实&#xff0c;具体而言&#xff0c;是一种虚假的感知&#xff0c;但在表面上却似乎是真实的。产生背景 检索增强生成&#xff08;RAG&…

leetcode541 反转字符串 II

给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前 k 个字符&…

线性神经网络示例

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个线性神经网络模型pytorch程序,最后打印5个条件分别的影响力。 一 在这个场景中&#xff0c;一个线性神经网络&…

【python量化交易】——文章目录指引

【python量化交易】—— 文章目录指引 blog里的文章越来越多&#xff0c;初来乍到的读者朋友很可能会无法快速找到想看的主题&#xff0c;因此&#xff0c;我把文章按照主题归类&#xff0c;并随时更新以保持同步&#xff0c;以方便朋友们查找。 获取金融数据&#xff0c;请参…

代码随想录算法训练营DAY32|C++贪心算法Part.2|122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II

文章目录 122.买卖股票的最佳时机II思路CPP代码 55.跳跃游戏思路CPP代码 45.跳跃游戏II思路方法一代码改善 CPP代码 122.买卖股票的最佳时机II 力扣题目链接 文章讲解&#xff1a;122.买卖股票的最佳时机II 视频讲解&#xff1a; 状态&#xff1a;本题可以用动态规划&#xff0…

boa交叉编译(移植到arm)

参考&#xff1a;CentOS7 boa服务器的搭建和配置-CSDN博客 以下操作在宿主机/编译平台操作&#xff1a; 1. 先执行[参考]1到3、 4.2、4.3、4.4、4.5 2. 修改MakeFile # 由以下&#xff1a; CC gcc CPP gcc -E # 改为&#xff1a; CC arm-linux-gnueabihf-gcc CPP arm-l…

def iris_type(s);np.loadtxt;x, y = np.split;为什么进行切片;

目录 def iris_type(s): 字节字符串和字符串区别 data = np.loadtxt x, y = np.split 为什么进行切

【Flask】Flask中HTTP请求与接收

一、接收http请求与返回响应 在Flask中&#xff0c;可以通过app.route装饰器来定义路由函数。 app.route(/BringGoods,methods [POST, GET]) GET请求&#xff1a;使用request.args.get(key)或者request.values.get(key)来获取URL中的参数。 POST请求&#xff1a; 使用req…

SSH新功能揭秘:远程工作提升指南【AI写作】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

014_用vim复制粘贴_保持双手正位

[oeasy]python0014_用vim复制粘贴_保持双手正位 继续运行 &#x1f94a; 回忆上次内容 程序员 还是 很可爱的 要关心 身边的程序员 啊 毕竟是新时代的 典型新职业 文明 主流职业 血型 渔猎采集文明 猎人 O 游牧文明 牧民 B 农业文明 农民 A 工业文明 工人 商…

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL

*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?C?CSTPTR MODULE: my51c.3.obj (my51c_3) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?C?CLDPTR MODULE: my51c.3.obj (my51c_3) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYM…

红魔9pro/9pro+秒解锁BL+获取root权限+刷国际版+救砖降级刷机教程

红魔8开始&#xff0c;官方对刷机就进行了很多限制&#xff0c;常见的就是阉割了解锁BL指令&#xff0c;让我们不能自 己解锁BL刷机了&#xff0c;而8代旧版并没有严格&#xff0c;自然我们可以使用旧版的abl分区来实现解锁BL 红魔9代发布开始&#xff0c;官方直接阉割了全部Ab…