Modern C++ std::shared_ptr线程安全吗(一)

通过《Modern C++ std::shared_ptr的实现原理》我们看到引用计数和weak计数在链接pthread的情况下都是原子操作,而不链接的情况必是单线程也没有竞争存在。
可以看到shared_ptr本身只读的情况下是线程安全的,但是有两种情况不怎么安全:

  1. 通过它操作被管理的对象就必须自己上锁以保证没有数据竞争了。
  2. 同一个shared_ptr对象被多个线程指向或引用,此时这个shared_ptr对象本身成了共享资源,如果存在一个线程修改shared_ptr对象本身(比如调用reset)则不安全。(请参考另一篇分析reset源码的帖子)

本节着重第一种情况,请看下面的程序:

#include <iostream>
#include <memory>
#include <thread>void shared_ptr_example() {std::shared_ptr<int> sharedInt = std::make_shared<int>(42);// Multiple threads increment the shared integerstd::thread t1([&sharedInt]() {for (int i = 0; i < 1000000; ++i) {// Accessing and modifying the shared data(*sharedInt)++;}});std::thread t2([&sharedInt]() {for (int i = 0; i < 1000000; ++i) {// Accessing and modifying the shared data(*sharedInt)++;}});t1.join();t2.join();// Output may vary due to the lack of synchronizationstd::cout << "Final value: " << *sharedInt << std::endl;
}int main() {shared_ptr_example();return 0;
}

在我机器上结果如下:

[mzhai@c++]$ ./a.out
Final value: 1385208
[mzhai@c++]$ ./a.out
Final value: 2000042
[mzhai@c++]$ ./a.out
Final value: 1375690

每次结果都不一样。所以必定存在数据竞争。

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

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

相关文章

STM32 IIC电量计LTC2944

1 描述 LTC2944 可在便携式产品应用中测量电池充电状态、电池电压、电池电流及其自身温度。宽输入电压范围允许使用高达 60V 的多节电池。精密库仑反向积分电流通过电池正极端子与负载或充电器之间的检测电阻器。 电压、电流和温度由内部 14 位无延迟 ΔΣ™ ADC 测量。测量结…

MySQL原理(四)索引(2)存储结构

前面提到&#xff0c;mysql按索引存储结构划分&#xff0c;主要有四种类型的索引&#xff1a;B-Tree索引、Hash索引、Full-text索引、R-Tree索引。 一、B-Tree索引 BTREE索引就是一种将索引值按一定的算法&#xff0c;存入一个树形的数据结构中&#xff08;二叉树&#xff09…

Linux:理解信号量以及内核中的三种通信方式

文章目录 共享内存的通信速度消息队列msggetmsgsndmsgrcvmsgctl 信号量semgetsemctl 内核看待ipc资源单独设计的模块ipc资源的维护 理解信号量总结 本篇主要是基于共享内存&#xff0c;延伸出对于消息队列和信号量&#xff0c;再从内核的角度去看这三个模块实现进程间通信 共享…

【教学类-44-04】20240130 print dashed(虚线字体)制作的数字描字帖

作品展示&#xff1a;背景需求&#xff1a; 制作绿色数字的数字描字帖 选用字体&#xff1a;print dashed&#xff08;虚线字体&#xff09; 【教学类-44-03】20240111阿拉伯数字字帖的字体&#xff08;三&#xff09;——德彪钢笔行书&#xff08;实线字体&#xff09;和pri…

如何使用Docker部署JSON Crack

文章目录 1. 在Linux上使用Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 JSON Crack 是一款免费的开源数据可视化应用程序&#xff0c;能够将 JSON、YAML、XML、CSV 等数据格式可视化为交互…

Kafka运维相关知识

目录 一、基本概念 二、技术特性 三、设计思想 四、运维建议 一、基本概念 Apache kafka 是一个分布式的基于push-subscribe的消息系统&#xff0c;它具备快速、可扩展、可持久化的特点。它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&#xff1a;比如基于h…

unity - 保存camera组件图像

My project(1) “CameraImage” public class CameraImage : MonoBehaviour {// 拍摄的相机对象public Camera captureCamera ;public void CaptureScreenshot(){// 图片保存根目录string dataPath "D:/A/B";// 图片文件夹中对应的本项目文件夹string productname…

Mysql基础篇笔记

数据表 链接&#xff1a;https://pan.baidu.com/s/1dPitBSxLznogqsbfwmih2Q 提取码&#xff1a;b0rp --来自百度网盘超级会员V5的分享 sql的执行顺序 根据顺序 也就是说 select后面的字段别名 只能在order by中使用 mysql不支持sql92的外连接 mysql不支持满外连接 可以…

TS-Antd:组件使用记录

组件使用记录&#xff08;持续更新&#xff09; 1、Input 组件自动获得焦点1.1 InputRef 类型1.2 代码实现 1、Input 组件自动获得焦点 和普通的 input 标签不同&#xff0c;antd 已经给 Input 组件提供了 InputRef 类型。在 Input 组件上添加 ref &#xff0c;获取到的是 Inp…

java反射常用方法

反射思维导图 使用案例 package Reflection.Work.WorkTest01;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays;public class WorkDe…

10-Nacos-灰度发布配置

用于生产上线后&#xff0c;针对指定主机IP做定向测试 1、在配置编辑中&#xff0c;勾选Beta发布&#xff0c;在文本框中勾选需要下发服务的IP地址&#xff0c;多个用英文逗号分隔。 正式版&#xff1a;这个是针对除了Beta版中指定的IP服务生效Beta版&#xff1a;灰度配置&am…

华为HCIP Datacom H12-831 卷17

1、以下关于本地LDP会话和远端LDP会话的描述,正确的有哪些项? A 本地LDP会话和远端LDP会话可以共存 B 缺省情况下,本地LDP会话发现阶段的报文目的IP为224.0.0.2 C 缺省情况下,远端LDP会话发现阶段的报文目的端口号为UDP646 D 缺省情况下,远端LDP会话发现阶段的报文…

粤Z车牌申请需要什么条件?

深圳湾口岸: 上一年度纳税数额达到15万元以上的&#xff0c;可以申办1个商务车指标 上一年度的纳税数额达到50万元以上的&#xff0c;可以申办第2个商务车指标; 上一年度的纳税数额达到100万元以上的&#xff0c;可以申办第3个商务车指标; 从申办第4个商务车指标起&#xff0c;…

yolov8:pt 转 onnx

yolov8官方教程 1.安装包 我使用的是虚拟环境&#xff0c;yolov8包已经下载到本地了&#xff0c;因此直接在anaconda prompt 命令行继续安装 首先激活自己的虚拟环境&#xff0c;然后执行安装命令 pip install ultralytics yolov8中没有requirement.txt文件&#xff0c;直接…

RTC实时时钟之读取时间

1. RTC 基本介绍 RTC(Real Time Clock) 即实时时钟&#xff0c;它是一个可以为系统提供精确的时间基准的元器件&#xff0c;RTC一般采用精度较高的晶振作为时钟源&#xff0c;有些RTC为了在主电源掉电时还可以工作&#xff0c;需要外加电池供电 2. RTC 控制器 2.1 RTC的特点是:…

知识点积累系列(四)Kubernetes篇【持续更新】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 知识点积累 系列文章的第四篇&#xff0c;记录日常学习中遇到的 Kubernetes 相关的知识点 1.Kubernetes琐碎知识点 1.1.为什么要有annotations annotation中除了能够记录一些额外信息&#xff0c;还可以解决k…

[BUUCTF]-PWN:cmcc_pwnme2解析

保护 ida 完整exp&#xff1a; from pwn import* context(log_leveldebug) #premote(node5.buuoj.cn,26964) pprocess(./pwnme2) addhome0x8048644 addflag0x8048682 getfile0x80485CB main0x80486F8 pop_ebp0x8048680 ret0x80483f2 pop_ebx0x8048409 pop_edi_ebp0x804867f st…

常见的网络安全威胁和防护方法

随着数字化转型和新兴技术在各行业广泛应用&#xff0c;网络安全威胁对现代企业的业务运营和生产活动也产生了日益深远的影响。常见的网络安全威胁通常有以下几种&#xff1a; 1. 钓鱼攻击 攻击者伪装成合法的实体&#xff08;如银行、电子邮件提供商、社交媒体平台等&#xf…

超越传统—Clean架构打造现代Android架构指南

超越传统—Clean架构打造现代Android架构指南 1. 引言 在过去几年里&#xff0c;Android应用开发经历了巨大的变革和发展。随着移动设备的普及和用户对应用的期望不断提高&#xff0c;开发人员面临着更多的挑战和需求。传统的Android架构在应对这些挑战和需求时显得有些力不从…

Java技术栈 —— Cookie和Session

在 Web 开发中&#xff0c;Cookie 和 Session 都是用于存储和管理用户状态信息的机制。 Cookie Cookie 是一小段文本数据&#xff0c;由服务器发送到用户的浏览器&#xff0c;并在浏览器中存储。 它包含了一些关于用户的信息&#xff0c;例如用户名、登录状态、购物车内容等。 …