c++ 线程同步的临界区应用举例

在C++中,临界区通常是通过互斥量(mutex)来实现的,因为互斥量用于保护代码段(即临界区),以确保在任意时刻只有一个线程可以执行该代码段。然而,从技术上来说,"临界区"是一个概念,而std::mutex是实现这一概念的一种手段。

以下是一个使用std::mutex来保护临界区的C++线程同步应用举例:

#include <iostream>  
#include <thread>  
#include <mutex>  
#include <vector>  // 定义一个全局的互斥量  
std::mutex mtx;  // 共享的全局变量  
std::vector<int> data;  // 线程函数,用于向共享向量中添加数据  
void add_data(int start, int end) {  for (int i = start; i < end; ++i) {  // 锁定互斥量以保护临界区  std::lock_guard<std::mutex> lock(mtx);  // 临界区开始  data.push_back(i);  // 临界区结束  // 在这里可以添加一些非关键性的操作,不需要互斥量保护  // ...  }  
}  int main() {  const int num_elements = 1000;  const int num_threads = 4;  const int elements_per_thread = num_elements / num_threads;  // 创建线程  std::vector<std::thread> threads;  for (int i = 0; i < num_threads; ++i) {  int start = i * elements_per_thread;  int end = (i == num_threads - 1) ? num_elements : start + elements_per_thread;  threads.emplace_back(add_data, start, end);  }  // 等待所有线程完成  for (auto& t : threads) {  t.join();  }  // 输出最终数据大小  std::cout << "Final data size is " << data.size() << std::endl;  // 理想情况下,最终数据大小应该是1000  return 0;  
}

在这个例子中,我们有一个共享的data向量,多个线程将向其添加数据。为了确保在添加数据时不会发生数据竞争,我们使用了一个std::mutex来保护向data添加元素的代码段(即临界区)。每个线程在添加元素之前都会锁定互斥量,添加完成后释放互斥量。这样,在任意时刻只有一个线程能够访问临界区,从而保证了数据的一致性。

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

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

相关文章

企业怎样进行IT外包以及IT外包服务内容

在数字化时代的浪潮中&#xff0c;企业逐渐认识到信息技术的关键作用&#xff0c;特别是制造业基地对于IT外包和运维服务的需求持续增长。然而&#xff0c;在诸多可供选择的IT外包和运维方案中&#xff0c;企业如何推动与IT外包公司的合作&#xff1f;本文将深入介绍IT外包方案…

液位开关常开常闭怎么区分

如今随着科学技术的不断发展&#xff0c;液位检测技术也不断改进&#xff0c;液位开关是如今常用的液位检测技术之一&#xff0c;那么液位开关常开常闭怎么区分&#xff1f; 常开液位开关是指在没有液体存在的情况下就处于导通状态。当液体液面上升到液位开关处时&#xff0c;…

C++| std::copy与memcpy区别

前言&#xff1a;最近在读项目源码&#xff0c;发现有些地方用std::copy&#xff0c;有些地方用memcpy。但是并不知道为什么要这样&#xff0c;但是原作者也不认识&#xff0c;就只好自己研究一下了。 std::copy与memcpy区别 对比使用场景使用std::copymemcpy 对比 相同&#…

探索大型语言模型在信息提取中的应用与前景

随着人工智能技术的快速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著的进展。特别是在信息提取&#xff08;IE&#xff09;任务中&#xff0c;LLMs展现出了前所未有的潜力和优势。信息提取是从非结构化文…

跨考专业课142分,上岸重邮!

这个系列会邀请上岸学长学姐进行经验分享~ 今天分享经验的同学是我的“关门弟子”&#xff0c;小叮当&#xff0c;跨考上岸重邮通信工程&#xff01;从平时和小叮当的交流和测试&#xff0c;就能看出专业课水平&#xff0c;我一直和她开玩笑说&#xff0c;早点遇到我&#xff…

网站为什么需要固态硬盘服务器

首先&#xff0c;SSD没有旋转磁盘&#xff0c;所以它读写数据的速度比HDD快。了解通过选择SSD固态硬盘服务器可以获得的其他潜在好处。 1.更快的速度&#xff1a;固态硬盘服务器上的站点加载速度可以比HDD服务器上的站点快三倍 2.更高的可靠性&#xff1a;由于缺少活动部件&am…

运行容器时发现内存不足(<2G)--docker版本低:重装docker

一、卸载&#xff1a; sudo yum install -y yum-utilssudo yum remove docker-ce docker-ce-cli containerd.iosudo rm -rf /var/lib/dockersudo rm -rf /var/lib/containerd 二、安装&#xff1a; sudo yum-config-manager --add-repo https://download.docker.com/linux/ce…

如果你作 为Java程序员曾经遭遇过NullPointerException,请举起手

如果你作 为Java程序员曾经遭遇过NullPointerException&#xff0c;请举起手 1.让Optional发光发热&#xff1a;去除代码中对null的检查&#xff0c; 采用防御式检查减少NullPointerException java8实战 书籍 第225页 免费下载链接&#xff1a; https://pan.quark.cn/s/5cf68…

python flask css样式无效

解释&#xff1a; Flask是一个Python的轻量级Web框架&#xff0c;它没有为CSS提供任何内置的支持。如果你在Flask项目中引入了CSS文件&#xff0c;但是这个CSS没有生效&#xff0c;可能的原因有&#xff1a; 路径不正确&#xff1a;你的CSS文件没有放在正确的目录下&#xff0…

GEE数据集——DeltaDTM 全球沿海数字地形模型数据集

DeltaDTM 全球沿海数字地形模型产品 简介 DeltaDTM 是全球沿岸数字地形模型&#xff08;DTM&#xff09;&#xff0c;水平空间分辨率为 1 弧秒&#xff08;∼30 米&#xff09;&#xff0c;垂直平均绝对误差&#xff08;MAE&#xff09;为 0.45 米。它利用 ICESat-2 和 GEDI …

react引入阿里矢量库图标

react引入阿里矢量库图标 登录阿里矢量库&#xff0c;将项目所需的图标放一起 react项目中新建文件夹MyIcon.js 3. 在页面中引入&#xff0c;其中type为图标名称

定时任务的几种实现方式

定时任务实现的几种方式&#xff1a; 1、JDK自带 &#xff08;1&#xff09;Timer&#xff1a;这是java自带的java.util.Timer类&#xff0c;这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行&#xff0c;但不能在指定时间运行。…

Unreal游戏GPU参数详解,游戏性能优化再升级

UWA GOT Online For Unreal GPU模式近期全新发布&#xff0c;方便开发者从渲染和带宽的角度进行GPU分析。同时&#xff0c;此次更新中UWA也增加了丰富的GPU参数&#xff0c;涵盖了GPU SoC和GPU Counter模块。这些新增的参数不仅能够帮助Unreal开发者从宏观层面监控GPU的压力状况…

Python爬虫--Urllib基础

1. urlretrieve Urllib 库也是类似 request 库&#xff0c;用来解析html的 首先讲 urlretrieve 子模块 这个模块的作用是将网页下载到本地 语法&#xff1a; urlretrieve(网址,本地地址) 例如&#xff1a; 这样就可以了&#xff0c;他会将百度网页下载到本地D盘下&#x…

怎么给切面增加开关

为切面添加开关功能&#xff0c;可以在运行时控制是否启用切面逻辑&#xff0c;这对于调试、性能优化或特定场景的灵活控制非常有用。下面是一个基于Spring AOP和配置属性实现的简单示例&#xff0c;展示了如何为切面逻辑添加开关。 步骤 1: 添加配置属性 首先&#xff0c;定…

【管理咨询宝藏93】大型制造集团数字化转型设计方案

【管理咨询宝藏93】大型制造集团数字化转型设计方案 【格式】PDF版本 【关键词】国际咨询公司、制造型企业转型、数字化转型 【核心观点】 - 235页大型制造型集团数字化转型方案设计&#xff01;细节非常详尽&#xff0c;图表丰富&#xff01; - 系统架构必须采用成熟、具有国…

Kafka应用Demo:按主题订阅消费消息

安装环境 Kafka安装可参考官方网站的指导(https://kafka.apache.org/quickstart), 按步骤解压压缩包&#xff0c;修改配置。然后再启动zookeeper和kafka-server即可。 需要注意的一点&#xff1a;如果是在VMware虚拟机上启动的kafka, 需要修改一下server.properties配置文件&am…

STM32G0存储器和总线架构

文章目录 前言一、系统架构二、存储器构成三、存储器地址映射四、存储器边界地址五、外设寄存器边界地址 前言 此文章是STM32G0 MCU的学习记录&#xff0c;并非权威&#xff0c;请谨慎参考。 STM32G0主流微控制器基于工作频率可达64 MHz的高性能Arm Cortex-M0 32位RISC内核。该…

观测云 VS ELK:谁是日志监控的王者?

前言 作为 IT 信息系统运行状态感知和故障分析的重要手段&#xff0c;日志在行业兴起之初便为运维和开发环节所广泛应用。当应用和系统发生故障或出现问题时&#xff0c;日志数据成为了排查和诊断问题的重要依据。通过分析日志&#xff0c;开发人员和运维人员可以了解系统的运…

(python读取目标检测PASCAL VOC数据集,将图像采用边缘填充的方法缩放到相应大小(例如640x640),并修改对应的xml文件

python读取目标检测PASCAL VOC数据集&#xff0c;将图像采用边缘填充的方法缩放到相应大小&#xff08;例如640x640&#xff09;&#xff0c;并修改对应的xml文件 单个文件处理批处理脚本 单个文件处理 import cv2 import os import xml.etree.ElementTree as ETdef resize_im…