一,互斥锁

互斥锁(Mutex,全称 Mutual Exclusion)是并发编程中用于保护共享资源的核心同步机制。它通过确保同一时间仅有一个线程访问临界区(Critical Section),解决多线程环境下的数据竞争和不一致性问题。

二,std::mutex

1,头文件

#include <mutex>

2,特性

  • 不支持拷贝构造和拷贝赋值,只有默认构造
  • std::mutex对象不支持移动语义,不支持swap。
  • std::mutex是非递归锁,递归锁使用std::recursive_mutex
  • unlock()次数过多时,会产生未定义的行为

3,成员函数

函数说明

lock()

获取锁,锁被其他线程占用时阻塞当前线程。
unlock()释放锁(必须由锁的持有线程调用)。
try_lock()获取锁,锁被占用时返回false,但不阻塞当前线程。锁未被占用且获取锁成功时返回true。

4,示例代码

#include <mutex>
#include <iostream>
#include <thread>static std::mutex tex;
void test01()
{std::lock_guard<std::mutex> locker(tex);std::cout << "A" << std::endl;std::cout << "B" << std::endl;std::cout << "====================" << std::endl;
}void test02()
{tex.lock();std::cout << "A" << std::endl;std::cout << "B" << std::endl;std::cout << "====================" << std::endl;tex.unlock();
}void test03()
{if (tex.try_lock()){std::cout << "A" << std::endl;std::cout << "B" << std::endl;std::cout << "====================" << std::endl;tex.unlock();}
}int main()
{std::mutex tess;for (int i = 0; i < 15; i++){std::thread th(test03);//std::thread th(test02);//std::thread th(test01);th.detach();}system("pause");std::cout << "Hello World!\n";
}

5,源码说明

根据源码解释mutex的特性。

_EXPORT_STD class mutex : public _Mutex_base { // class for mutual exclusion
public:// 只支持无参构造mutex() noexcept = default;// 不支持拷贝构造mutex(const mutex&)            = delete;// 不支持拷贝赋值mutex& operator=(const mutex&) = delete;
};
    void lock() {if (_Mtx_lock(_Mymtx()) != _Thrd_result::_Success) {// 未定义行为,仅发生在普通互斥锁上(N4950标准 [thread.mutex.requirements.mutex.general]/6 条款)_STD _Throw_Cpp_error(_RESOURCE_DEADLOCK_WOULD_OCCUR);}if (!_Verify_ownership_levels()) {// only occurs for recursive mutexes (N4950 [thread.mutex.recursive]/3)// POSIX specifies EAGAIN in the corresponding situation:// https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutex_lock.html_STD _Throw_Cpp_error(_RESOURCE_UNAVAILABLE_TRY_AGAIN);}}

下面是部分代码行逐行说明:

_Mtx_lock(_Mymtx()) != _Thrd_result::_Success

_Mymtx()是获取当前互斥量底层原生句柄。在Windows平台上,C++标准库互斥量(std::mutex)的底层原生句柄是CRITICAL_SECTION对象。这是Windows系统提供的高性能线程同步原语,完全由Windows内核创建和管理。

Windows CRITICAL_SECTION本质上是递归的。std::mutex的非递归特性是由C++标准库在上层强制实现的。将底层互斥量句柄_Mymtx()传递给_Mtx_lock()函数,_Mtx_lock()函数尝试锁定互斥锁,此时会执行递归检测,如果是递归加锁,会导致锁定失败,然后抛出异常:

_STD _Throw_Cpp_error(_RESOURCE_DEADLOCK_WOULD_OCCUR);

_Verify_ownership_levels()会检查递归锁的嵌套深度是否超限。超限时抛出异常。

三,std::recursive_mutex

与std::mutex相比,recursive_mutex是递归锁。它允许同一线程多次获取锁而不会导致异常。

1,特性

  • recursive_mutex是递归锁,它可以多次调用lock和try_lock(),每次调用会增加内部的锁计数
  • 多次加锁之后,必须调用同等次数的unlock(),才能解锁
  • 与std::mutex相同,不支持移动语义,不支持swap
  • unlock()次数过多时,会产生未定义的行为

2,成员函数

函数说明

lock()

获取锁,锁被其他线程占用时阻塞当前线程。获取锁成功时,增加锁计数。
unlock()减少锁计数,锁计数为0时释放锁(必须由锁的持有线程调用)。
try_lock()获取锁,锁被占用时返回false,但不阻塞当前线程。锁未被占用且获取锁成功时返回true,同时增加锁计数。

3,示例代码

static std::recursive_mutex tex;
void test01()
{std::lock_guard<std::recursive_mutex> locker(tex);std::lock_guard<std::recursive_mutex> locker1(tex); // 可多次加锁std::cout << "A" << std::endl;std::cout << "B" << std::endl;std::cout << "====================" << std::endl;
}void test03()
{if (tex.try_lock()){if (tex.try_lock()){std::cout << "A" << std::endl;if (tex.try_lock()){std::cout << "B" << std::endl;if (tex.try_lock()){tex.lock();std::cout << "====================" << std::endl;}}}tex.unlock(); tex.unlock(); tex.unlock(); tex.unlock(); tex.unlock();}
}

四,std::timed_mutex

std::timed_mutex(定时互斥锁)是 C++11 标准库提供的带有超时功能的互斥量类型,它在 std::mutex 基础上增加了尝试获取锁直到超时的能力,适用于需要避免无限期阻塞的场景。

1,特性

  • std::timed_mutex对象不支持拷贝构造和拷贝赋值
  • std::timed_mutex对象不支持移动语义,不支持swap
  • std::timed_mutex是非递归锁
  • unlock()次数过多时,会产生未定义的行为

2,成员函数

函数说明
lock()阻塞直到获得锁
unlock()释放锁
try_lock()立即尝试获取锁(非阻塞)
try_lock_for(rel_time)相对时间段内尝试获取锁(超时返回 false
try_lock_until(abs_time)绝对时间点前尝试获取锁(超时返回 false

3,示例代码

#include <mutex>
#include <iostream>
#include <thread>static std::timed_mutex timeMutex;void test04()
{if (!timeMutex.try_lock_for(std::chrono::milliseconds(1000))){std::cout << "获取锁超时" << std::endl;}else{std::cout << "A" << std::endl;std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 模拟工作timeMutex.unlock();}
}int main()
{std::mutex tess;for (int i = 0; i < 15; i++){std::thread th(test04);th.detach();}system("pause");std::cout << "Hello World!\n";
}

五:std::recursive_timed_mutex

超时递归锁。与timed_mutex相比,允许递归加锁。

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

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

相关文章

Qt中的QWebSocket 和 QWebSocketServer详解:从协议说明到实际应用解析

前言 本篇围绕 QWebSocket 和 QWebSocketServer&#xff0c;从协议基础、通信模式、数据传输特点等方面展开&#xff0c;结合具体接口应用与实战案例进行说明。 在实时网络通信领域&#xff0c;WebSocket 技术以其独特的全双工通信能力&#xff0c;成为连接客户端与服务器的重要…

机器学习 —— 决策树

机器学习 —— 决策树&#xff08;Decision Tree&#xff09;详细介绍决策树是一种直观且易于解释的监督学习算法&#xff0c;广泛应用于分类和回归任务。它通过模拟人类决策过程&#xff0c;将复杂问题拆解为一系列简单的判断规则&#xff0c;最终形成类似 “树” 状的结构。以…

车规MCU软错误防护技术的多维度分析与优化路径

摘要&#xff1a;随着汽车电子技术的飞速发展&#xff0c;微控制单元&#xff08;MCU&#xff09;在汽车电子系统中的应用日益广泛。然而&#xff0c;大气中子诱发的单粒子效应&#xff08;SEE&#xff09;对MCU的可靠性构成了严重威胁。本文深入探讨了软错误防护技术在车规MCU…

原生微信小程序实现语音转文字搜索---同声传译

效果展示 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/23257ce3b6c149a1bb54fd8bc2a05c68.png#pic_center 注意&#xff1a;引入同声传译组件请看这篇文章 1.search.wxml <view class"search-page"><navigation-bar title"搜索" …

Wireshark安装过程缺失vc_runtimeMinimum_x64.msi文件,安装 Visual C++ Redistributable

一、我大意了 一开始是Npcap装不上。 在这个网站下的&#xff1a; Wireshark (kafan58.com) 安装程序&#xff1a; 安装过程&#xff1a; 无语死了&#xff0c;感觉被骗了......外网下的才是最正版的。 二、外网正版 下载最新的4.4.8版本Wireshark重新安装 2.1 vc_runtime…

高通平台Wi-Fi Display学习-- 调试 Wi-Fi Display 问题

4.1 调试 WFD 性能 4.1.1 通过启用调节器模式验证 WFD 当系统设为调节器模式时,设备的运行时钟将达到峰值。要在系统中启用调节器模式,应 在序列中输入以下命令: 1. adb shell stop mpdecision 2. adb shell echo 1→/sys/devices/system/cpu/cpu1/online 3. adb shell…

5G专网与SD-WAN技术融合:某饮料智能工厂网络架构深度解析

随着工业互联网的快速发展&#xff0c;制造业正从传统的生产模式向智能化、数字化方向转型。某饮料智能工厂项目创新性地引入了5G专网与SD-WAN技术&#xff0c;形成了“连接-计算-应用-安全”的全链条网络架构。本文将深入剖析这两种技术在智能工厂中的应用场景、部署架构&…

Java项目:基于SSM框架实现的公益网站管理系统【ssm+B/S架构+源码+数据库+毕业论文+答辩PPT+远程部署】

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本公益网站就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&#x…

向华为学习——IPD流程体系之IPD术语

第一章 IPD体系 1.1集成产品开发IPD Integrated Product Development,IPD是一种领先的、成熟的产品开发的管理思想和管理模式。它是根据大量成功的产品开发管理实践总结出来的,并被大量实践证明的高效的产品开发模式。通过IPD,可建立起基于市场和客户需求驱动的集成产品开…

落霞归雁:从自然之道到“存内计算”——用算法思维在芯片里开一条“数据高速航道”

作者 落霞归雁&#xff08;CSDN首发&#xff0c;转载请注明&#xff09; 段落一 现象&#xff1a;当“摩尔”老去&#xff0c;数据却在狂奔 过去 30 年&#xff0c;CPU 频率翻了 60 倍&#xff0c;而 DRAM 带宽只翻了 20 倍。算力与带宽的剪刀差&#xff0c;让“计算”变成“等…

StyleX:Meta推出的高性能零运行时CSS-in-JS解决方案

简介 StyleX 是由 Meta 开发的零运行时 CSS-in-JS 解决方案&#xff0c;在构建时将样式编译为静态 CSS&#xff0c;消除运行时开销。 核心特性 零运行时开销 – 构建时编译为静态 CSS类型安全 – 完整的 TypeScript 支持原子化 CSS – 自动生成原子化类名&#xff0c;最小化…

LINUX 85 SHElL if else 前瞻 实例

问题 判断用户是否存在 id user id $user变量判断vsftpd软件包被安装 rpm -q vsftpd rpm -ql vsftpd >& null[rootweb ~]# rpm -ql vsftpd >/dev/null 2>&1 您在 /var/spool/mail/root 中有邮件yum install vsftpd 内核主版本判断 uname -rcut -d[rootweb ~]#…

2025 年非关系型数据库全面指南:类型、优势

非关系型数据库的分类与特点随着数据量呈指数级增长和数据类型日益多样化&#xff0c;传统关系型数据库在处理海量非结构化数据时面临着严峻挑战。非关系型数据库&#xff08;NoSQL&#xff09;应运而生&#xff0c;它摒弃了传统关系模型的约束&#xff0c;采用更灵活的数据存储…

深度残差网络ResNet结构

Deep Residual Learning for Image Recognition&#xff0c;由Kaiming He、Xiangyu Zhang、Shaoqing Ren和Jian Sun于2016年发表在CVPR上 1512.03385 (arxiv.org)https://arxiv.org/pdf/1512.03385 下图中&#xff0c;左侧为VGG19网络&#xff0c;中间为34层的普通网络&#xf…

python笔记--socket_TCP模拟浏览器实现

""" 1,导包 2,创建TCP套接字 3,建立连接 4,拼接客户端请求报文 5,发送请求报文 6,接收响应报文 7,过滤出html页面 8,保存为html文件 9,关闭套接字 """ # 1,导包 import socket # 2,创建TCP套接字 tcp_socketsocket.socket(socket.AF_INET,socket…

西门子PLC基础指令4:置位指令 S、复位指令 R

布尔指令 1、置位指令 S Setbit 是要进行置位操作的地址的首地址&#xff0c;N 是从该首地址开始连续置位的位数 。 LD I0.0 // 装载输入继电器I0.0的状态&#xff08;当I0.0为ON时&#xff0c;执行后续指令&#xff09; S Q0.0, 3 // 从Q0.0开始&#xff0c;连续置位3…

2.3 子组件样式冲突详解

Vue2组件样式冲突的成因与解决方案组件样式冲突的根本原因在Vue单页面应用中&#xff0c;所有组件的DOM结构最终都会合并到同一个index.html 页面中。若子组件未使用scoped属性&#xff0c;其样式会默认全局生效&#xff0c;导致不同组件中相同选择器&#xff08;如h1、.contai…

26-数据仓库与Apache Hive

1.数据仓库 是什么&#xff1f;解决什么&#xff1f;1.1 数据仓库Data Warehouse 数仓 / DW 是一个用于存储、分析、报告的数据系统.目的&#xff1a;构建面向分析的集成数据环境&#xff0c;分析结构为企业提供决策支持。数仓专注于分析数仓本身不“”生产“”数据&#xff0c…

前端開發技術教學(二)

書接上回&#xff1a;前端開發技術教學(一) -CSDN博客 必要資源&#xff1a;TRAE - The Real AI Engineer 目录 一) 自定義函數 - function 二) DOM操控 DOM事件 a.) onclick b.) onkeydown 三) AI寫代碼 書接上回說到的前端3種主語言以及其用法&#xff0c;這期我們…

设计模式 - 组合模式:用树形结构处理对象之间的复杂关系

文章目录一、引言二、模式原理分析三、代码示例四、核心要点五、使用场景分析六、案例七、为何使用组合模式&#xff1f;八、优缺点剖析九、最佳实践建议十、总结一、引言 “组合模式”&#xff08;Composite Pattern&#xff09;常被误解为“组合关系”。前者专注于将对象组合…