在 C++ 中,互斥量(std::mutex)是一种用于多线程编程中保护共享资源的机制,防止多个线程同时访问某个资源,从而避免数据竞争(data race)和不一致的问题。


🔒 一、基础用法:std::mutex

头文件:#include <mutex>

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx; // 创建一个互斥量
int counter = 0;void increment(int id) {for (int i = 0; i < 10000; ++i) {mtx.lock();       // 加锁++counter;        // 访问共享资源mtx.unlock();     // 解锁}
}

你可以通过多个线程调用 increment(),互斥量保证了线程安全。


✅ 更推荐的方式:使用 std::lock_guard

它是一种 RAII(资源获取即初始化) 的封装类,作用域结束时会自动解锁,非常安全,防止漏解锁。

void increment(int id) {for (int i = 0; i < 10000; ++i) {std::lock_guard<std::mutex> lock(mtx);++counter;} // 作用域结束时自动释放锁
}

⛔ 错误示例(不要这样做):

mtx.lock();
++counter;
// 如果中间抛异常,mutex 可能永远不会 unlock

🧠 其他互斥量类型

类型说明
std::mutex最基本的互斥量
std::recursive_mutex支持同一线程多次加锁
std::timed_mutex支持带超时的锁操作
std::shared_mutexC++17,引入读写锁(多个读一个写)

🧪 示例:多个线程安全地写输出

#include <iostream>
#include <thread>
#include <mutex>std::mutex print_mtx;void safe_print(const std::string& msg) {std::lock_guard<std::mutex> lock(print_mtx);std::cout << msg << std::endl;
}int main() {std::thread t1(safe_print, "hello from thread 1");std::thread t2(safe_print, "hello from thread 2");t1.join();t2.join();return 0;
}

try_lock()timed_mutex

if (mtx.try_lock()) {// 成功获得锁mtx.unlock();
} else {// 没拿到锁,干别的事
}
std::timed_mutex tmtx;
if (tmtx.try_lock_for(std::chrono::milliseconds(100))) {// 拿到锁tmtx.unlock();
}

总结:

方法是否推荐用法说明
mutex.lock()/unlock()❌ 不推荐(容易忘记 unlock)
std::lock_guard✅ 推荐,简单安全
std::unique_lock✅ 推荐,需要更灵活控制时
try_lock / timed_mutex✅ 用于尝试加锁或有时间要求

如你需要我帮你写一个完整的多线程例子(比如生产者-消费者模型、线程池、文件读写等),可以直接告诉我场景!

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

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

相关文章

CSS Content符号编码大全

资源宝整理分享&#xff1a;​https://www.httple.net​ 前端开发中常用的特殊符号查询工具&#xff0c;包含Unicode编码和HTML实体编码&#xff0c;方便开发者快速查找和使用各种符号。支持基本形状、箭头、数学符号、货币符号等多种分类。 前端最常用符号 图标形状十进制十…

RPC常见问题回答

项目流程和架构设计 1.服务端的功能&#xff1a; 1.提供rpc调用对应的函数 2.完成服务注册 服务发现 上线/下线通知 3.提供主题的操作 (创建/删除/订阅/取消订阅) 消息的发布 2.服务的模块划分 1.网络通信模块 net 底层套用的moude库 2.应用层通信协议模块 1.序列化 反序列化数…

【JavaEE】(3) 多线程2

一、常见的锁策略 1、乐观锁和悲观锁 悲观锁&#xff1a;预测锁冲突的概率较高。在锁中加阻塞操作。乐观锁&#xff1a;预测锁冲突的概率较低。使用忙等/版本号等&#xff0c;不产生阻塞。 2、轻量级锁和重量级锁 重量级锁&#xff1a;加锁的开销较大&#xff0c;线程等待锁…

创客匠人服务体系解析:知识 IP 变现的全链路赋能模型

在知识服务行业深度转型期&#xff0c;创客匠人通过 “工具 陪跑 圈层” 的三维服务体系&#xff0c;构建了从 IP 定位到商业变现的完整赋能链条。这套经过 5 万 知识博主验证的模型&#xff0c;不仅解决了 “内容生产 - 流量获取 - 用户转化” 的实操难题&#xff0c;更推动…

国产ARM/RISCV与OpenHarmony物联网项目(六)SF1节点开发

一、终端节点功能设计 1. 功能说明 终端节点设计的是基于鸿蒙操作系统的 TCP 服务器程序&#xff0c;用于监测空气质量并提供远程控制功能。与之前的光照监测程序相比&#xff0c;这个程序使用 E53_SF1 模块&#xff08;烟雾 / 气体传感器&#xff09;&#xff0c;主要功能包…

Plotly图表全面使用指南 -- Displaying Figures in Python

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 在 Python 中显示图形 使用 Plotly 的 Python 图形库显示图形。 显示图形 Plotly的Python图形库plotly.py提供了多种显示图形的选项和方法…

getx用法详细解析以及注意事项

源码地址 在 Flutter 中&#xff0c;Get 是来自 get 包的一个轻量级、功能强大的状态管理与路由框架&#xff0c;常用于&#xff1a; 状态管理路由管理依赖注入&#xff08;DI&#xff09;Snackbar / Dialog / BottomSheet 管理本地化&#xff08;多语言&#xff09; 下面是 …

深度学习:人工神经网络基础概念

本文目录&#xff1a; 一、什么是神经网络二、如何构建神经网络三、神经网络内部状态值和激活值 一、什么是神经网络 人工神经网络&#xff08;Artificial Neural Network&#xff0c; 简写为ANN&#xff09;也简称为神经网络&#xff08;NN&#xff09;&#xff0c;是一种模仿…

Unity2D 街机风太空射击游戏 学习记录 #12环射道具的引入

概述 这是一款基于Unity引擎开发的2D街机风太空射击游戏&#xff0c;笔者并不是游戏开发人&#xff0c;作者是siki学院的凉鞋老师。 笔者只是学习项目&#xff0c;记录学习&#xff0c;同时也想帮助他人更好的学习这个项目 作者会记录学习这一期用到的知识&#xff0c;和一些…

网站如何启用HTTPS访问?本地内网部署的https网站怎么在外网打开?

在互联网的世界里&#xff0c;数据安全已经成为了每个网站和用户都不得不面对的问题。近期&#xff0c;网络信息泄露事件频发&#xff0c;让越来越多的网站开始重视起用户数据的安全性&#xff0c;因此启用HTTPS访问成为了一个热门话题。作为一名网络安全专家&#xff0c;我希望…

计算机网络-----详解网络原理TCP/IP(上)

文章目录 &#x1f4d5;1. UDP协议✏️1.1 UDP的特点✏️1.2 基于UDP的应用层协议 &#x1f4d5;2. TCP协议✏️2.1 TCP协议段格式✏️2.2 TCP协议特点之确认应答✏️2.3 TCP协议特点之超时重传✏️2.4 TCP协议特点之连接管理✏️2.5 TCP协议特点之滑动窗口✏️2.6 TCP协议特点…

Lora训练

一种大模型高效训练方式&#xff08;PEFT&#xff09; 目标&#xff1a; 训练有限的ΔW&#xff08;权重更新矩阵&#xff09; ΔW为低秩矩阵→ΔWAB&#xff08;其中A的大小为dr, B的大小为rk&#xff0c;且r<<min(d,k)&#xff09;→ 原本要更新的dk参数量大幅度缩减…

蓝牙 5.0 新特性全解析:传输距离与速度提升的底层逻辑(面试宝典版)

蓝牙技术自 1994 年诞生以来,已经经历了多次重大升级。作为当前主流的无线通信标准之一,蓝牙 5.0 在 2016 年发布后,凭借其显著的性能提升成为了物联网(IoT)、智能家居、可穿戴设备等领域的核心技术。本文将深入解析蓝牙 5.0 在传输距离和速度上的底层技术逻辑,并结合面试…

Minio使用https自签证书

自签证书参考&#xff1a;window和ubuntu自签证书_windows 自签证书-CSDN博客 // certFilePath: 直接放在 resources 目录下 或者可以自定实现读取逻辑 // 读取的是 .crt 证书文件public static OkHttpClient createTrustingOkHttpClient(String certFilePath) throws Excep…

汽车前纵梁焊接总成与冲压件的高效自动化三维检测方案

汽车主体结构件上存在很多安装位&#xff0c;为保证汽车装配时的准确性&#xff0c;主体结构件需要进行全方位的尺寸和孔位置精度检测&#xff0c;以确保装配线的主体结构件质量合格。 前纵梁焊接总成是车身框架的核心承载部件&#xff0c;焊接总成由多片钣金冲压件焊接组成&a…

F接口基础.go

前言&#xff1a;接口是一组方法的集合&#xff0c;它定义了一个类型应该具备哪些行为&#xff0c;但不关心具体怎么实现这些行为。一个类型只要实现了接口中定义的所有方法&#xff0c;那么它就实现了这个接口。这种实现是隐式的&#xff0c;不需要显式声明。 目录 接口的定…

cartographer官方指导文件说明---第3章 cartographer前端算法流程介绍

cartographer官方指导文件说明 第3章 cartographer前端算法流程介绍 3.1 Scan Match扫描匹配 扫描匹配&#xff08;Scan Matching&#xff09;是 Cartographer 中实现局部SLAM的核心技术&#xff0c;它通过优化算法将当前激光扫描数据对齐到子图地图中。下面从计算过程、数学…

汽车整车厂如何用数字孪生系统打造“透明车间”

随着工业4.0时代的发展&#xff0c;数字孪生技术已成为现代制造业的重要利器。特别是在汽车整车厂&#xff0c;通过数字孪生系统的应用&#xff0c;能够有效打造一个“透明车间”&#xff0c;实现生产过程的全面可视化与实时监控&#xff0c;提高生产效率&#xff0c;降低成本&…

openKylin适配RISC-V高性能服务器芯片,携手睿思芯科共拓智算新蓝海

3月31日&#xff0c;睿思芯科&#xff08;深圳&#xff09;技术有限公司&#xff08;简称“睿思芯科”&#xff09;2025春季新品发布会在深圳前海国际会议中心盛大举行&#xff0c;作为RISC-V领域的年度盛事&#xff0c;此次发布会吸引了众多业内目光。此次发布会上&#xff0c…

【已解决】lxml.etree.ParserError: Document is empty

本专栏解决日常生活工作中非快速找到解决方案的问题。 问题背景 在爬取某网站时&#xff0c;使用开源框架报错&#xff1a;lxml.etree.ParserError: Document is empty 解决方案 1、多个搜索引擎中查找&#xff0c;建议都是对lxml的python源码进行修改&#xff0c;不好用。…