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

【C++多线程编程】(二)之详解锁(lock)和解锁(unlock)

在C++多线程编程中,锁(lock)和解锁(unlock)通常用于管理共享资源的访问,以防止多个线程同时对资源进行修改,从而避免竞态条件(Race Condition)和数据不一致性问题。C++标准库提供了一些工具来实现锁,其中最常用的是互斥锁(std::mutex)和锁卫士(std::lock_guard)。

以下是一个简单的示例,演示了如何在C++中使用互斥锁和锁卫士:

#include <iostream>
#include <thread>
#include <mutex>std::mutex myMutex;  // 定义一个互斥锁void sharedResourceFunction(int id) {// 在代码块中使用锁卫士,lock_guard 在构造时锁住互斥锁,在析构时释放锁std::lock_guard<std::mutex> lock(myMutex);// 在这个代码块中,对共享资源进行读写操作是安全的std::cout << "Thread " << id << " is accessing the shared resource." << std::endl;// 在这个代码块结束后,锁会自动释放,即使发生了异常
}int main() {const int numThreads = 3;std::thread threads[numThreads];for (int i = 0; i < numThreads; ++i) {threads[i] = std::thread(sharedResourceFunction, i + 1);}for (int i = 0; i < numThreads; ++i) {threads[i].join();}return 0;
}

1、std::mutex myMutex;:这一行定义了一个互斥锁对象 myMutex。互斥锁用于保护共享资源,确保在任何时候只有一个线程可以访问它。

2、std::lock_guardstd::mutex lock(myMutex);:这一行创建了一个 std::lock_guard 对象,它在构造时锁住 myMutex,在析构时释放锁。这确保了在进入 sharedResourceFunction 函数时锁被锁住,在函数结束时锁被自动释放。这种自动释放锁的方式避免了忘记手动释放锁的问题。

3、std::cout << “Thread " << id << " is accessing the shared resource.” << std::endl;:在锁保护的代码块中对共享资源进行操作。在这个例子中,只是简单地打印一条信息。

4、std::thread threads[numThreads];:创建了一个包含 numThreads 个线程的数组。

5、threads[i] = std::thread(sharedResourceFunction, i + 1);:创建了多个线程,每个线程都调用 sharedResourceFunction 函数,并传递不同的线程ID(1、2、3)。

6、threads[i].join();:等待所有线程执行完毕。调用 join 保证主线程等待所有子线程执行完毕后再继续执行,防止主线程提前退出导致子线程被强制终止。

总体而言,这个例子演示了如何使用互斥锁和锁卫士确保多个线程对共享资源的安全访问。在实际应用中,需要根据具体情况选择适当的同步机制和锁类型。

相关文章:

【C++多线程编程】(二)之详解锁(lock)和解锁(unlock)

在C多线程编程中&#xff0c;锁&#xff08;lock&#xff09;和解锁&#xff08;unlock&#xff09;通常用于管理共享资源的访问&#xff0c;以防止多个线程同时对资源进行修改&#xff0c;从而避免竞态条件&#xff08;Race Condition&#xff09;和数据不一致性问题。C标准库…...

【Mypy】超级实用的python高级库!

今天&#xff0c;我很兴奋地向大家介绍一个神奇的Python库&#xff1a;Mypy。这个库是Python世界中的一颗璀璨明星&#xff0c;提供了静态类型检查的强大功能&#xff0c;极大地增强了Python这门动态类型语言的健壮性和可维护性。我们将深入探索Mypy的多个方面&#xff0c;并通…...

【Python基础】循环语句

文章目录 [toc]什么是循环Python中的循环方式while循环格式示例 什么是循环 程序中需要重复执行的代码&#xff0c;可以通过循环实现比如和女朋友道歉&#xff0c;或一万遍“宝宝&#xff0c;我错了”&#xff0c;在没有学习循环之前&#xff0c;我们只能通过如下方式实现 pr…...

【面试】广告优化

a1&#xff1a;点击率公式是什么&#xff1f;点击率低的原因是什么&#xff1f; 点击率点击/曝光&#xff0c;点击率低的原因主要有两点&#xff1a;一是创意不吸引人&#xff1b;二是目标受众不准确/定向过宽不精确&#xff0c;广告曝光给了对产品不感兴趣用户 a2&#xff1a;…...

RabbitMQ插件详解:rabbitmq_message_timestamp【Rabbitmq 五】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 RabbitMQ时空之旅&#xff1a;rabbitmq_message_timestamp的奇妙世界 前言什么是rabbitmq_message_timestamprabbitmq_message_timestamp 的定义与作用&#xff1a;如何在 RabbitMQ 中启用消息时间戳&…...

AD9361 Evaluation Software配置脚本转换工具

最近在玩一个开源的AD9361项目&#xff0c;AD9361采用纯逻辑配置&#xff0c;不需要ARM或者MicroBlaze。其中&#xff0c;先是用AD9361 Evaluation Software生成配置脚本&#xff0c;再转换成ad9361_lut.v。 在网上查了一圈&#xff0c;有个转换工具叫bit_converter&#xff0…...

Centos7 配置Git

随笔记录 目录 1&#xff0c; 新建用户 2. 给用户设置密码相关操作 3. 为新用户添加sudo 权限 4. 配置Git 4.1 配置Git 4.2 查看id_ras.pub 5, 登录Git 配置SSH 秘钥 6. Centos7 登录Git 7. clone 指定branch到本地 8. 将新代码复制到指定路径 9. 上传指定代码 …...

python工具方法 44 数据仿真生成(粘贴目标切片到背景图像上,数据标签校验)

在深度学习训练中数据是一个很重要的因素,在数据不够时需要我们基于现有的数据进行增强生成新的数据。此外,在某特殊情况,如对某些目标切片数据(例如:石块分割切片)预测效果较差,需要增强其在训练数据中的频率。故此,我们可以将先有数据标注中的目标裁剪出来,作为样本…...

Llama 架构分析

从代码角度进行Llama 架构分析 Llama 架构分析前言Llama 架构分析分词网络主干DecoderLayerAttentionMLP 下游任务因果推理文本分类 Llama 架构分析 前言 Meta 开发并公开发布了 Llama系列大型语言模型 (LLM)&#xff0c;这是一组经过预训练和微调的生成文本模型&#xff0c;参…...

vue3前端 md5工具类

工具类 /*** Namespace for hashing and other cryptographic functions* Copyright (c) Andrew Valums* Licensed under the MIT license, http://valums.com/mit-license/*/var V V || {}; V.Security V.Security || {};(function () {// for faster accessvar S V.Secur…...

Unity触摸 射线穿透UI解决

unity API 之EventSystem.current.IsPointerOverGameObject() 命名空间 &#xff1a;UnityEngine.EventSystems 官方描述&#xff1a; public bool IsPointerOverGameObject(); public bool IsPointerOverGameObject(int pointerId); //触摸屏时需要的参数&#xff…...

基于QTreeWidget实现带Checkbox的多级组织结构选择树

基于QTreeWidget实现带Checkbox的多级组织结构选择树 采用基于QWidgetMingw实现的原生的组织结构树 通过QTreeWidget控件实现的带Checkbox多级组织结构树。 Qt相关系列文章&#xff1a; 一、Qt实现的聊天画面消息气泡 二、基于QTreeWidget实现多级组织结构 三、基于QTreeWidget…...

探索 Vim:一个强大的文本编辑器

引言&#xff1a; Vim&#xff08;Vi IMproved&#xff09;是一款备受推崇的文本编辑器&#xff0c;拥有强大的功能和高度可定制性&#xff0c;提供丰富的编辑和编程体验。本文将探讨 Vim 的基本概念、使用技巧以及为用户带来的独特优势。 简介和发展 1. Vim 的简介和历史 V…...

K8S(十)—容器探针

这里写目录标题 容器探针&#xff08;probe&#xff09;检查机制探测结果探测类型何时该使用存活态探针?何时该使用就绪态探针?何时该使用启动探针&#xff1f; 使用exechttptcpgrpc使用命名端口 使用启动探针保护慢启动容器定义就绪探针配置探针HTTP 探测TCP 探测探针层面的…...

[C错题本]

1.int,short,long都是signed的 但是char可能是signed 也可能是unsigned的——《C Primer》 2.在16位的PC中 char类型占1个字节 int占2个字节 long int占4个字节 float占四个字节 double占八个字节 3.自增运算符和自减运算符即使是在判断条件中使用也会实际生效 int i 1; int…...

tomcat启动异常:子容器启动失败(a child container failed during start)

最近在使用eclipse启动Tomcat时&#xff0c;发现一个问题&#xff0c;启动以前的项目突然报子容器启动异常。 异常信息如下&#xff1a; 严重: 子容器启动失败 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 无法启动组件[org.apache.…...

JAVA序列化(创建可复用的 Java 对象)

JAVA 序列化(创建可复用的 Java 对象) 保存(持久化)对象及其状态到内存或者磁盘 Java 平台允许我们在内存中创建可复用的 Java 对象&#xff0c;但一般情况下&#xff0c;只有当 JVM 处于运行时&#xff0c;这些对象才可能存在&#xff0c;即&#xff0c;这些对象的生命周期不…...

如何使用自动化工具编写测试用例?

以下为作者观点&#xff0c;仅供参考&#xff1a; 在快速变化的软件开发领域&#xff0c;保证应用程序的可靠性和质量至关重要。随着应用程序复杂性和规模的不断增加&#xff0c;仅手动测试无法满足行业需求。 这就是测试自动化发挥作用的地方&#xff0c;它使软件测试人员能…...

redis底层数据结构之skiplist实现

skiplist实现 skiplist跳跃表&#xff0c;是一种有序数据结构&#xff0c;通过在每个节点中维持多个指向其他节点的指针&#xff0c;来达到快速访问节点的目的&#xff0c;redis使用skiplist作为zsort的底层实现之一 结构很像树形结构 typedef struct zskiplistNode { // 对象…...

mjpg-streamer配置其它端口访问视频

环境 树莓派4B ubuntu 20.04 U口摄像头 确认摄像头可访问 lsusb查看 在dev下可查看到video* sudo mplayer tv://可打开摄像头并访问到视频 下载mjpg-streamer并编译安装 在github下载zip包&#xff0c;下载的源码&#xff0c;需要编译安装 unzip解压 cd mjpg-streamer/mjp…...

HsMod:炉石传说终极模改插件完整指南 - 300%游戏体验提升方案

HsMod&#xff1a;炉石传说终极模改插件完整指南 - 300%游戏体验提升方案 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是一款基于BepInEx框架开发的炉石传说模改插件&#xff0c;为…...

高级安卓开发工程师:性能与功耗优化技术深度解析

引言 随着移动设备的普及和智能化程度不断提升,安卓平台作为全球最大的移动操作系统之一,对开发工程师提出了更高的要求。高级安卓开发工程师不仅需要掌握核心编程技能,还需深入理解性能优化和功耗优化策略,以应对日益复杂的应用场景。本文基于职位描述的核心需求,聚焦于…...

自托管项目管理与知识库系统:基于文件存储的轻量级解决方案

1. 项目概述与核心价值最近在折腾个人知识库和项目管理工具&#xff0c;发现很多现成的方案要么太重&#xff0c;要么太轻&#xff0c;要么就是配置起来让人头大。直到我遇到了一个叫bicodeurubu/pm-wiki-v2的项目&#xff0c;它给我的第一印象是“清爽”。这其实是一个基于现代…...

如何破解Wallpaper Engine资源文件:终极RePKG工具指南

如何破解Wallpaper Engine资源文件&#xff1a;终极RePKG工具指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 想要修改Wallpaper Engine动态壁纸却打不开PKG资源包&#xff1f;…...

别再手动汇总了!锐捷BGP路由聚合实战:用aggregate-address优化你的路由表(含as-set、suppress-map详解)

锐捷BGP路由聚合实战&#xff1a;优化网络架构的智能选择 在大型企业网络架构中&#xff0c;BGP路由表规模的膨胀常常成为网络工程师的噩梦。当路由条目突破十万级别时&#xff0c;设备内存占用激增、路由收敛速度下降、网络稳定性面临严峻挑战。传统的手工汇总方式不仅效率低下…...

保姆级避坑指南:AWR1864毫米波雷达从开箱到跑通第一个Demo(附驱动、固件版本匹配心得)

AWR1864毫米波雷达开发实战&#xff1a;从零到Demo的避坑全攻略 刚拿到AWR1864评估模块(EVM)的开发者&#xff0c;往往会被TI毫米波雷达技术的强大功能所吸引&#xff0c;却在第一步就遭遇各种"水土不服"。驱动安装报错、固件版本混乱、开发板无法识别、Demo连接失败…...

构建本地离线文档库:DevDocs 部署与开发效率提升指南

1. 项目概述&#xff1a;一个为开发者量身定制的本地知识库如果你和我一样&#xff0c;每天都要和大量的技术文档、API参考、编程语言手册打交道&#xff0c;那你一定对在十几个浏览器标签页之间反复横跳、或者依赖不稳定的网络去访问某个官方文档站点的体验深恶痛绝。cyberagi…...

Ubuntu history 命令实用教程(设置记录命令行数或永久记录等)

Ubuntu history 命令实用教程简介一、认识 history 是什么二、查看本机当前历史配置1. 查看当前历史条数限制2. 查看历史文件实际已有多少条记录三、手动设置 history 指定记录行数1. 编辑配置文件2. 写入指定行数配置3. 保存退出并生效四、设置 history 永久不删除&#xff08…...

从零构建本地AI编程助手:Mervelas的隐私优先架构与Bun技术栈实践

1. 项目概述&#xff1a;一个为开发者主权而生的本地AI编程助手 如果你和我一样&#xff0c;对市面上那些“全家桶”式的AI编程助手感到厌倦——它们要么偷偷收集你的代码数据&#xff0c;要么把你锁死在某个特定的云服务里&#xff0c;用起来总感觉束手束脚——那么&#xff…...

VSCode连接Ubuntu虚拟机(VMware/VirtualBox)编辑文件,总提示Permission Denied?可能是这个共享文件夹权限问题

VSCode连接Ubuntu虚拟机编辑文件时Permission Denied的深度解决方案 跨平台开发已经成为现代开发者的标配工作流&#xff0c;而VSCode配合虚拟机更是常见的开发环境组合。但当你兴致勃勃地在Windows或macOS上通过VSCode连接到Ubuntu虚拟机&#xff0c;准备大展拳脚时&#xff0…...