C++ | 多线程使用vector

news2024/11/16 3:20:17

多线程使用vector

文章目录

  • 多线程使用vector
    • 场景描述
    • 原因分析
    • 解决
    • 代码测试
      • 不扩容和提前扩容 size 与 capacity 变化
      • 欢迎关注公众号【三戒纪元】

场景描述

最近在看代码优化,看到有这样的代码:

std::vector<int> valid_indices;

void SimbaSegmenter::GridFilter::Clean() {
  valid_indices.reserve(rows * cols);
  valid_indices.clear();
}

第一反应是,既然是Clean函数,肯定就是想清空这个数组,清空之前还要reserve一下,不是多此一举吗?

于是将第4行代码去掉了。

程序会报错:

0x7f8fd86169a7 std::vector<>::emplace_back<>()

原因分析

原本代码思路:在对valid_indices 赋值之前,先清空一下,然后将符合条件的数存入 valid_indices 数组。

问题在于程序使用的是多线程。

代码单线程测试了一下,也是没问题的,多线程的问题出在哪里呢?

问题就是出在赋值 emplace_back 时,如果发现 容量capacity 不够时,vector 会扩容

多个线程同时到达 vector 的 emplace_back 语句,如果发现 capacity 不够了,开始扩容。这时几个线程同时扩容,就会造成资源竞争冲突,就会报错。

而如果加上第4句,先扩容到1个很大的范围,但是clear仅仅是将成员清除,使得size为0,因此多线程 emplace_back的时候,就能够直接emplace_back了,不会发生扩容问题。

解决

多线程需要同时对同一个vector进行写入的时候,先扩容到一个值,避免各个线程单独扩容,保证程序稳定有效进行。

代码测试

不扩容和提前扩容 size 与 capacity 变化

int main() {
  std::vector<int> randy3;// 初始化: size : 0, capacity: 0
  randy3.reserve(2); // reserve  size : 0, capacity: 2
  std::cout << "reserve size: " << randy3.size() << ", capacity: " << randy3.capacity() << std::endl;
    
  std::vector<int> randy2; // 初始化: size : 0, capacity: 0
  std::cout << "1 size: " << randy2.size() << ", capacity: " << randy2.capacity() << std::endl;
  
  randy2.clear(); // 清空size,  size : 0, capacity: 0
  std::cout << "2 clear size: " << randy2.size() << ", capacity: " << randy2.capacity() << std::endl;

  randy2.resize(2); // 扩容 capacity 为2 ,  size : 0, capacity: 0
  std::cout << "3 size: " << randy2.size() << ", capacity: " << randy2.capacity() << std::endl;

  randy2.clear(); // 清空size,  size : 0, capacity: 2
  std::cout << "4 clear size: " << randy2.size() << ", capacity: " << randy2.capacity() << std::endl;

  randy2.emplace_back(2); // emplace_back 1 个元素,  size : 1, capacity: 2
  std::cout << "5 clear size: " << randy2.size() << ", capacity: " << randy2.capacity() << std::endl;


  randy2.emplace_back(13);// 再 emplace_back 1 个元素,  size : 2, capacity: 2
  std::cout << "6 clear size: " << randy2.size() << ", capacity: " << randy2.capacity() << std::endl;


  randy2.emplace_back(22); // emplace_back 第 3 个元素,  size : 3, capacity: 4
  std::cout << "7 clear size: " << randy2.size() << ", capacity: " << randy2.capacity() << std::endl;
}

结果:

reserve size: 0, capacity: 2
1 size: 0, capacity: 0
2 clear size: 0, capacity: 0
3 size: 2, capacity: 2
4 clear size: 0, capacity: 2
5 clear size: 1, capacity: 2
6 clear size: 2, capacity: 2
7 clear size: 3, capacity: 4

欢迎关注公众号【三戒纪元】

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

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

相关文章

APP测试面试题快问快答(五)

21. App自动化你用的什么工具&#xff1f; 框架&#xff1a;Appium 编译环境和工具&#xff1a;python3.7和PyCharm 环境&#xff1a;Android sdk 第三方模拟器&#xff1a;夜神、蓝叠等模拟器 定位工具&#xff1a;uiautomatorviewer 实时日志查看&#xff1a;ddms 22.…

Tapdata 重磅更新已就绪!全托管云服务上线,应用场景再扩展

继 5 月举办的 「连接 1 次孤岛&#xff0c;服务 N 个场景」主题产品发布会后&#xff0c;Tapdata Live Data Platform 现已实现功能特性的全面升级&#xff0c;并基于自身产品能力积极探索在应用场景层面的落地实践及无限可能。 在去年 6 月的 Tapdata 2.0 发布会上&#xff…

Threejs实现数字人3D粽子

个人主页&#xff1a; 左本Web3D&#xff0c;更多案例预览请点击》 在线案例 个人简介&#xff1a;专注Web3D使用ThreeJS实现3D效果技巧和学习案例 &#x1f495; &#x1f495;积跬步以至千里&#xff0c;致敬每个爱学习的你。喜欢的话请三连&#xff0c;有问题请私信或者加微…

美国访问学者的父母如何申请探亲签证?

对于美国访问学者的父母来说&#xff0c;申请探亲签证是能够让他们在美国与子女团聚的重要途径。下面是知识人网小编整理的一些关于如何申请探亲签证的基本步骤和要点&#xff0c;希望对您有所帮助。 第一步&#xff1a;了解签证类型 在开始申请探亲签证之前&#xff0c;父母需…

【增值税发票识别 OCR】如何实现自动化发票管理

导言 在现代商业环境中&#xff0c;管理和处理大量的增值税发票数据是一项繁琐而重要的任务。传统的手动处理方法既费时又容易出错&#xff0c;而使用增值税发票识别OCR API可以实现自动化的发票管理&#xff0c;大大减少人工处理的工作量。本文将介绍如何利用增值税发票识别O…

Hadoop --- HDFS介绍

HDFS 全称是Hadoop Distributed File System hadoop分布式&#xff08;cluser&#xff09;文件存储系统。适合一次写入&#xff0c;多次读出的场景。 HDFS不需要单独安装&#xff0c;安装Hadoop的时候带了HDFS系统。 Hadoop安装可以参考&#xff1a; 有基础的&#xff0c;已…

轻松了解OPC:实时数据通信领域的必备神器!

OPC简介 OPC&#xff08;OLE for Process Control&#xff0c;进程控制对象连接&#xff09;是一种在工业自动化领域中被广泛使用的技术&#xff0c;它允许不同厂商的自动化设备之间进行通信和数据交换。 OPC技术最早是由美国的软件公司OPC Foundation推出的&#xff0c;它通…

【jsDelivr】jsDelivr - 一个免费、快速、可靠的为JS和开源项目服务的CDN

文章目录 jsDelivr 简介jsDelivr 工作原理 jsDelivr加速域名如下cdn.jsdelivr.net 2023/06/21 域名解析结果fastly.jsdelivr.net 2023/06/21 域名解析结果gcore.jsdelivr.net 2023/06/21 域名解析结果test1.jsdelivr.net 2023/06/21 域名解析结果 仓库拓展 - 其他CDNnpmESMGitH…

nginx nginx-module-vts 监控模块

nginx nginx-module-vts 监控模块 大纲 nginx-module-vts 安装nginx-module-vts 配置监控字段总结配置参数总结vhost_traffic_status_filter_by_host 使用vhost_traffic_status_filter_by_set_key 使用 nginx-module-vts 安装 nginx-module-vts 可以实现对nginx 各个虚拟主…

接口测试是什么?如何测试?

扫盲内容&#xff1a; 1.什么是接口&#xff1f; 2.接口都有哪些类型&#xff1f; 3.接口的本质是什么&#xff1f; 4.什么是接口测试&#xff1f; 5.问什么要做接口测试&#xff1f; 6.怎样做接口测试&#xff1f; 7.接口测测试点是什么&#xff1f; 8.接口测试都要掌…

在Linux系统实现服务器端和客户端的多线程并发通信

先导知识&#xff1a; 在Linux系统实现服务器端和客户端的套接字通信_小梁今天敲代码了吗的博客-CSDN博客 线程同步&#xff08;一&#xff09;_小梁今天敲代码了吗的博客-CSDN博客 线程同步&#xff08;二&#xff09;_小梁今天敲代码了吗的博客-CSDN博客 线程同步&#x…

通付盾入围《2023年度中国数字安全能力图谱(行业版)》

近日&#xff0c;数世咨询发布《2023年度中国数字安全能力图谱&#xff08;行业版&#xff09;》。通付盾作为以分布式数字身份和大数据决策智能技术为核心的数字化高端软件与服务提供商&#xff0c;凭借在数字安全领域的实力和影响力&#xff0c;入选政府、互联网两大行业细分…

实战react+ts+antd遇见的问题之自定义树形结构

目录 自定义编辑树搜索树形结构搜索算法原理 实时更改数据界面不随之发生变化 自定义编辑树 需求要求在每个节点的后面加上新增&#xff0c;编辑&#xff0c;删除按钮&#xff0c;并且能够点击编辑title的显示变成input输入框&#xff0c;antd的案例中没有这种情况&#xff0c…

逍遥自在学C语言 | 指针函数与函数指针

前言 在C语言中&#xff0c;指针函数和函数指针是强大且常用的工具。它们允许我们以更灵活的方式处理函数和数据&#xff0c;进而扩展程序的功能。 本文将介绍指针函数和函数指针的概念&#xff0c;并讲解一些常见的应用示例。 一、人物简介 第一位闪亮登场&#xff0c;有请…

金士顿U盘无法识别的修复软件,方便好用

一、PD V1.16 先打开“PDx16.exe”这个软件&#xff0c;插入U盘。就会在“DEVICE 1”那里检测到U盘&#xff08;如果没有&#xff0c;就用另外的软件&#xff09;。然后按“全部开始”。当完成好&#xff0c;再重新插入U盘。 二、2090&2090E_V1.6.9_普通版070628 1、插入…

工业机器人运动学与Matlab正逆解算法学习笔记(用心总结一文全会)(二)

文章目录 机器人逆运动学※ 代数解、几何解&#xff0c;解析解&#xff08;封闭解&#xff09;、数值解的含义与联系○ 代数解求 θ 1 \theta_1 θ1​、 θ 2 \theta_2 θ2​、 θ 3 \theta_3 θ3​※参考资料 求解 θ 1 \theta_1 θ1​ 求解 θ 3 \theta_3 θ3​ 求解 θ 2 \t…

JUC高级-0620

8. CAS 原子类&#xff1a;Atomic没有CAS之前&#xff1a;多线程环境不使用原子类保证线程安全i&#xff08;基本数据类型&#xff09;&#xff0c;可以使用synchronized&#xff0c;但是很重有CAS之后&#xff1a; 使用AtomicInteger.getAndIncrement这样的API&#xff0c;保…

ARM的半主机模式(Semihosting)

本文介绍ARM的半主机模式&#xff0c;并介绍在MCU进行调试时其他的调试方法和手段。 1.ARM半主机模式(Semihosting) ARM Semihosting是ARM平台的一个独特功能&#xff0c;它允许使用主机上的输入和输出函数&#xff0c;通过硬件调试器转发到微控制器&#xff0c;通过挂接到I/…

网络解析----faster rcnn

Faster R-CNN&#xff08;Region-based Convolutional Neural Network&#xff09;是一种基于区域的卷积神经网络用于目标检测任务的模型。它是一种两阶段的目标检测方法&#xff0c;主要包含以下几个步骤&#xff1a; Region Proposal Network&#xff08;RPN&#xff09;: F…

c++ vector的扩容机制

1、当向vector push_back一个元素时&#xff0c;如果此时元素个数超过了vector的容量&#xff0c;会触发扩容 2、扩容的过程是&#xff1a;开辟新空间->拷贝旧空间的元素->释放旧空间 3、扩容过程中开辟新空间的大小影响着往vector插入元素的效率&#xff1a; 如果新空…