还有人认为C++容器是线程安全的吗?

C++标准库中的容器(如std::vector, std::list, std::map等)本身不是线程安全的、不是线程安全的、不是线程安全的,重要的事情讲三遍。这意味着如果你在多线程环境中同时访问(读或写)同一个容器实例,而没有进行适当的同步(如使用互斥锁、原子操作等),那么你的程序可能会遇到数据竞争和不一致的问题。幸运的时候你只是访问到了非预期的错误数据,但大多数情况下程序将会导致异常退出。

具体来说,C++标准库并没有为容器提供内置的线程安全机制。当你从多个线程访问容器时,必须确保:

  1. 读写分离:在任一时刻,要么只有一个线程在写入容器,要么所有线程都在读取容器,但不能同时有读和写操作。
  2. 使用同步机制:通过互斥锁(如std::mutex)、读写锁(如std::shared_mutex,C++17及以后)、条件变量、原子操作等同步机制来协调不同线程对容器的访问。

虽然C++标准库容器本身不是线程安全的,但我们可以使用类似 std::mutex 互斥锁来控制对容器的访问。以下示例展示了如何在多线程环境中安全地修改和访问 std::vector 中的数据。

示例:多线程安全地向 std::vector 添加元素

#include <iostream>  
#include <vector>  
#include <thread>  
#include <mutex>  // 定义一个全局的互斥锁  
std::mutex g_mtx;  // 定义一个全局的vector  
std::vector<int> g_data;  // 线程函数,用于向vector中添加元素  
void add_data(int value) {  // 锁定互斥锁  std::lock_guard<std::mutex> lock(g_mtx);  // 安全地向vector中添加元素  g_data.push_back(value);  // lock_guard的析构函数会自动解锁互斥锁  
}  int main() {  // 创建并启动10个线程,每个线程向vector中添加一个唯一的值  std::thread threads[10];  for (int i = 0; i < 10; ++i) {  threads[i] = std::thread(add_data, i);  }  // 等待所有线程完成  for (auto& th : threads) {  th.join();  }  // 输出vector的内容  for (int val : g_data) {  std::cout << val << ' ';  }  std::cout << std::endl;  return 0;  
}

以上示例我们定义了一个全局的 std::vector g_data 用于存储数据,和一个全局的 std::mutex g_mtx 用于同步对 data 的访问。add_data 函数接收一个 int 类型的参数 value,并使用 std::lock_guard(std::mutex) 来自动管理对 g_mtx 的锁定和解锁。

在 main 函数中,我们创建了一个 std::thread 数组 threads,并循环启动 10 个线程,每个线程调用 add_data 函数并传入一个唯一的值。

通过调用每个线程的 join 方法,等待所有线程完成它们的任务。确保在输出 g_data 的内容之前,所有元素都已被安全地添加到 data 中。

最后,遍历 g_data 并输出其内容。由于使用了互斥锁,可以确信将输出所有线程成功添加的元素。

-End-

#想了解更多精彩内容,关注下方公众号。

本人小杨哥:

超20年C++开发经验,独立软件开发;著名开源产品高并发C++应用服务器MYCP作者;开源企业即时通讯软件Entboost首席架构师;开发有【WordBN字远笔记】等共享软件产品。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【二叉树的最大深度】带你理解递归奥妙!

&#x1f680;个人主页&#xff1a;一颗小谷粒 &#x1f680;所属专栏&#xff1a;力扣刷题 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 &#x1f4a5;1.1 题目要求 ​&#x1f4a5;1.2 算法思路 &#x1f4a5;1.3 图解分析 &#x1…

elementui组件el-upload实现批量文件上传

el-upload组件上传文件时&#xff0c;每传一个文件会调一次接口&#xff0c;所以当上传多个文件的时候&#xff0c;有 n 个文件就要调 n 次接口。 刚好之前工作中遇到使用el-upload组件批量上传文件的需求&#xff0c;来看看怎么实现。 思路&#xff1a; 1.取消组件的自动上…

Springboot项目总结

1.为了调用写在其他包里面的类的方法 但是不使用new来实现调用这个类里面的方法&#xff0c;这个时候我们就需要将这个类注入到ioc容器里面&#xff0c;通过ioc容器来实现自动生成一个对象。 对ioc容器的理解&#xff1a;自动将一个对象实现new. 考察了and 和 or组合使用&…

[docker]入门

本文章主要讲述的是&#xff0c;docker基本实现原理&#xff0c;docker概念的解释&#xff0c;docker的使用场景以及docker打包与部署的应用。 文章中docker所运行的系统&#xff1a;CentOS Linux release 7.9.2009 (Core) 目录 docker是什么&#xff0c;什么时候需要去使用 …

房产销售系统:SpringBoot技术优势分析

第三章 系统分析 3.1 系统设计目标 房产销售系统主要是为了用户方便对房源信息管理、房源类型管理、房子户型管理、交易订单管理、预约看房管理、评价管理等信息进行查询&#xff0c;也是为了更好的让管理员进行更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各…

5.安卓逆向-java面向对象

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 上一个内容&#xff1a;4.安卓逆向-常用数据结构java语言中的集合 之前的内容写了java语言常用的数据结构&#xff08…

OpenAI o1:AI领域的“草莓”革命,华人科学家贡献卓越

最近&#xff0c;科技界的热门明星“草莓”频繁出现在大家的视线中。9月11号&#xff0c;The Information报道称&#xff1a;OpenAI计划在未来两周内推出一款更智能、更昂贵、更谨慎的AI模型&#xff01;网友们对此消息持怀疑态度&#xff0c;认为类似消息屡见不鲜&#xff0c;…

创新数字生态:智慧园区的益处与影响

智慧园区是一种利用先进信息技术、智能设备和数据分析手段来提升管理效率、改善居住体验、节约资源以及推动可持续发展的新型城市发展模式。其好处和影响不仅局限于提高工作效率&#xff0c;还涉及社会、生态、经济等多个方面的积极影响。 好处 智能化管理优势: 智慧园区能够实…

mac上Charles怎么配置,可以抓取浏览器/IDEA的接口

一、抓取浏览器接口 1、下载安装Charles后&#xff0c;按下图操作安装证书&#xff0c;mac撒好难过要把证书调整为可信任 2、打开macOS代理 方式一&#xff1a;指点开启这里 方式二&#xff1a;进入代理配置中开启&#xff0c;结果和方式一一样的 3、这时就可以抓取到浏览器…

编写注册接口与登录认证

编写注册接口 在UserController添加方法 PostMapping("/login")public Result login(Pattern(regexp "^\\S{5,16}$") String username,Pattern(regexp "^\\S{5,16}$") String password){ // 根据用户名查询用户User loginUser userS…

8个前端库-小且美

前提&#xff1a;前端有很多小而美的库&#xff0c;接入成本很低又能满足日常开发需求&#xff0c;同时无论是 npm 方式引入还是直接复制到本地使用都可以。 1.radash radash相比与 lodash&#xff0c;更加面向现代&#xff0c;提供更多新功能&#xff08;tryit&#xff0c;…

系统架构设计师教程 第5章 5.2需求工程 笔记

5.2 需求工程 ★★★★★ 软件需求是指用户对系统在功能、行为、性能、设计约束等方面的期望。 软件需求包括3个不同的层次&#xff1a;业务需求、用户需求和功能需求(也包括非功能需求)。 (1)业务需求 (business requirement) 反映了组织机构或客户对系统、产品高层次的目标…

哪款宠物空气净化器是除浮毛王者?希喂、范罗士、霍尼韦尔宠物空气净化器实测

养宠人绕不过的痛——掉毛&#xff01;脱毛&#xff01;又到了掉毛季&#xff0c;就连空气中都有毛毛……不管遇到谁&#xff0c;都知道你养猫养狗了——只因T恤变身毛线衫、毛毛怎么都粘不干净。不止是衣服上&#xff0c;地板上、沙发上、桌面上&#xff0c;哪哪都是毛。开始养…

[产品管理-15]:NPDP新产品开发 - 13 - 产品创新流程 - 具体产品的创新流程:精益生产与敏捷开发

目录 前言&#xff1a;​ 一、集成产品开发IPD模型——集成跨功能团队的产品开发 1.1 概述 1、IPD模型的核心思想 2、IPD模型的主要组成部分 3、IPD模型的实施步骤 4、IPD模型的优点 1.2 基于IPD系统的组织实践等级 1.3 IPD的优缺点 二、瀑布开发模型 1、定义与特点…

物体识别之微特征识别任务综述

“深度人工智能”是成都深度智谷科技旗下的人工智能教育机构订阅号&#xff0c;主要分享人工智能的基础知识、技术发展、学习经验等。此外&#xff0c;订阅号还为大家提供了人工智能的培训学习服务和人工智能证书的报考服务&#xff0c;欢迎大家前来咨询&#xff0c;实现自己的…

python安装换源

安装 python 使用演示的是python 3.8.5 安装完成后&#xff0c;如下操作打开命令行&#xff1a;同时按 “WindowsR” > 输入 “cmd” -> 点击确定 python换源 临时换源&#xff1a; #清华源 pip install markdown -i https://pypi.tuna.tsinghua.edu.cn/simple # 阿里…

个性化、持续性阅读 学生英语词汇量自然超越标准

2024年秋季新学年&#xff0c;根据2022版《义务教育英语课程标准》全新修订的英语新版教材开始投入使用&#xff0c;标志着我国英语教育迈入了一个以应用为导向、注重综合素养培养的新阶段。 新版教材的变革不仅仅是一次词汇量的简单增加&#xff0c;更是一场从应试到应用的深…

【鸿蒙】HarmonyOS NEXT星河入门到实战9-组件化开发进阶应用状态管理

目录 1.1 创建页面 1.2 页面跳转和后退 1.3 页面栈 1.4 路由模式 1.5 路由传参 2、生命周期 3、Stage模型 3.1 目录概览 3.2 app.json5应用配置 3.3 module.json5模型配置 3.4 UIAbility组件 3.5 UIAbility的添加和设置启动 3.6 UIAbility组件的生命周期 3.7 拉起另…

微信小程序基本信息填写要求(收藏)

小程序基本信息填写 小程序名称&#xff1a;小程序在发布前&#xff0c;名称设置成功以后有2次修改名称机会&#xff0c;2次机会用完&#xff0c;必须先发布后&#xff0c;才可通过微信认证进行改名。 小程序头像&#xff1a;新头像不允许涉及政治敏感与色情;图片格式必须为&…

使用nvm安装node版本报错

报错 windows 通过nvm安装版本&#xff0c;在本地安装了nvm后&#xff0c;通过nvm安装node报错了&#xff0c;报错如下图&#xff1a; 解决方法 1.如果你找不到相关配置文件在哪儿&#xff0c;可以打开vscode在终端输入nvm root&#xff0c;此时就会显示你的nvm配置文件路径&…