rust学习-Arc

背景介绍

线程安全的引用计数指针。 “Arc”代表“原子引用计数 Atomically Reference Counted”。

Arc 类型提供在堆中分配的 T 类型值的共享所有权(shared ownership)。在 Arc 上调用克隆会生成一个新的 Arc 实例,该实例指向堆上与源 Arc 相同的分配,同时增加引用计数。当指向给定分配的最后一个 Arc 指针被销毁时,存储在该分配中的值(通常称为“内部值”)也会被删除。

Rust 中的共享引用默认不允许mutation,Arc 也不例外:通常无法获得对 Arc 内某些内容的可变引用。如果需要通过 Arc 进行mutate,请使用 Mutex、RwLock 或 Atomic 类型之一。

注意:此类型仅在支持原子加载和指针存储的平台(platforms that support atomic loads and stores of pointers)上可用,其中包括所有支持 std crate 的平台,但不包括所有仅支持 alloc 的平台。这可以在编译时使用 #[cfg(target_has_atomic = “ptr”)] 检测到。

与 Rc 不同,Arc 使用原子操作进行引用计数。这意味着它是线程安全的。缺点disadvantage是原子操作比普通内存访问(ordinary memory accesses)更昂贵。如果不在线程之间共享引用计数分配,请考虑使用 Rc 来降低开销。 Rc 是一个安全的默认值,因为编译器会捕获在线程之间发送 Rc 的任何尝试(catch any attempt to send an Rc between threads)。但是,library可能会选择 Arc 以便为library使用者提供更大的灵活性。

只要 T 实现了Send 和 Sync,Arc 就会实现Send 和 Sync。
为什么不能将非线程安全类型 T 放入 Arc 中以使其成为线程安全的?
乍一看这可能有点违反直觉(a bit counter-intuitive):
毕竟,难道不是 Arc 线程安全的重点吗( isn’t the point of Arc thread safety? )?
关键点是:Arc 使得对同一数据拥有多个所有权(have multiple ownership of the same data)是线程安全的,但它并没有为其数据添加线程安全性。
考虑 Arc<RefCell>。 RefCell 不是Sync的,如果 Arc 始终是Send,则 Arc<RefCell> 也会如此。但这样我们就会遇到一个问题:RefCell 不是线程安全的;它使用非原子操作跟踪借用计数(keeps track of the borrowing count using non-atomic operations)。

最后,这意味着可能需要将 Arc 与某种 std::sync 类型(通常是 Mutex)配对使用(pair Arc with some sort of std::sync type, usually Mutex)。

Breaking cycles with Weak

用 Weak 打破cycle
downgrade 方法可用于创建非拥有的 Weak 指针(a non-owning Weak pointer)。弱指针(Weak pointer)可以升级为 Arc,但如果存储在分配(allocation)中的值已被删除,这将返回 None。换句话说,弱指针不会使分配内的值保持 active 状态;但是,它们确实使allocation(值的后端存储?)保持 active 状态(they do keep the allocation (the backing store for the value) alive)。

Arc 指针之间的循环永远不会被释放。因此,使用Weak来打破循环。例如,一棵树可以具有从父节点到子节点的强Arc指针,以及从子节点返回到其父节点的Weak指针。

创建

使用 Clone trait 给 Arc 和 Weak

impl<T> Clone for Arc<T>
whereT: ?Sized,
fn clone(&self) -> Arc<T>
use std::sync::Arc;
let foo = Arc::new(vec![1.0, 2.0, 3.0]);// 两种方式等价
let a = foo.clone();
let b = Arc::clone(&foo);
// a, b, and foo are all Arcs that point to the same memory location

Deref behavior

在 Arc 上可以调用 T 的方法,因为 Arc 自动解引用到 T
为了避免与 T 的方法发生名称冲突,Arc 本身的方法是关联函数,使用完全限定语法(fully qualified syntax)进行调用:

use std::sync:

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

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

相关文章

Lua语法之简单变量

--nil有点类似空null a nil print(a) --type函数得到类型 返回值是string print(type(a)) print("*****")--number是数值 int float这些 --lua的变量可以随便赋值 自动识别类型 a 1 print(a) print(type(a)) print("*****")--siting可以用单引号双引号 a…

LeetCode 面试题 08.01. 三步问题

文章目录 一、题目二、Java 题解 一、题目 三步问题。有个小孩正在上楼梯&#xff0c;楼梯有n阶台阶&#xff0c;小孩一次可以上1阶、2阶或3阶。实现一种方法&#xff0c;计算小孩有多少种上楼梯的方式。结果可能很大&#xff0c;你需要对结果模1000000007。 示例1: 输入&…

华为云HECS云服务器docker环境下安装nginx

前提&#xff1a;有一台华为云服务器。 华为云HECS云服务器&#xff0c;安装docker环境&#xff0c;查看如下文章。 华为云HECS安装docker-CSDN博客 一、拉取镜像 下载最新版Nginx镜像 (其实此命令就等同于 : docker pull nginx:latest ) docker pull nginx查看镜像 dock…

凉鞋的 Unity 笔记 001. 概述

001. 概述 大家好&#xff0c;我是凉鞋。 在笔者 8 年的技术生涯中&#xff0c;笔者学习并使用了很多技术&#xff0c;这些技术接触顺序如下 javaandroidiOScocos2d/xUnitynodejspython/django.net corereactGameMaker StudioGodot 而越是接触更多的技术&#xff0c;越是会…

PMIC介绍

PMIC电源管理芯片

实体行业数字化转型怎么做?线上线下相结合的新零售体系怎么做?

如今&#xff0c;实体行业想要取得收入增长&#xff0c;只做线下业务或者只做线上业务&#xff0c;在当前的市场环境中是难以长久生存的&#xff0c;因此一定要线上线下相结合&#xff0c;将流量运作与线下转化进行充分结合&#xff0c;才能更好地发挥实体优势&#xff0c;带来…

Linux学习记录——삼십일 socket编程---TCP套接字

文章目录 TCP套接字简单通信1、服务端1、基本框架2、获取连接 2、客户端3、多进程4、多线程5、线程池6、简单的日志系统7、守护进程8、其它 TCP套接字简单通信 本篇gitee 学习完udp套接字通信后&#xff0c;再来看TCP套接字。 四个文件tcp_server.hpp&#xff0c; tcp_serve…

什么是Local Storage和Session Storage?它们之间有什么区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是 Local Storage 和 Session Storage&#xff1f;Local Storage&#xff08;本地存储&#xff09;Session Storage&#xff08;会话存储&#xff09; ⭐ 区别⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的…

程序员的浪漫:如何用java代码画❤️表白呢?

有位小伙伴说&#xff0c;看到一个帖子&#xff0c;一个计算机博士接亲时&#xff0c;要求现场写代码&#xff0c;5分钟做出一个爱心。我们就看看如何用java设计出心形的代码。 我找了一下&#xff0c;发现方法竟然很多&#xff0c;我们就来见识一下&#xff0c;最后我们看一下…

python经典百题之画一个最优美的图案

创建一个最优美的图案是一个主观性很强的任务&#xff0c;因为美感取决于个人品味和审美观点。在这里&#xff0c;我将提供三种不同方法来绘制图案&#xff0c;但最终的美感取决于观者的个人喜好。 程序分析 我们的目标是通过编写Python程序绘制一个美观的图案。我们将尝试三…

TouchGFX之字体缓存

使用二进制字体需要将整个字体加载到存储器。 在某些情况下&#xff0c;如果字体很大&#xff0c;如大字号中文字体&#xff0c;则这样做可能不可取。 字体缓存使应用能够从外部存储器只能加载显示字符串所需的字母。 这意味着整个字体无需保存到在可寻址闪存或RAM上&#xff…

Openresty通过Lua+Redis 实现动态封禁IP

求背景 为了封禁某些爬虫或者恶意用户对服务器的请求&#xff0c;我们需要建立一个动态的 IP 黑名单。对于黑名单之内的 IP &#xff0c;拒绝提供服务。并且可以设置失效 1.安装Openresty&#xff08;编译安装&#xff09; wget https://openresty.org/download/openresty-1.…

SQL SELECT 语句进阶

之前探讨了SQL SELECT 语句的基础内容,包括语法、字段选择、记录限制和数据源指定。今天将进一步深入,探讨多表连接、过滤结果集和逻辑运算等高级主题,还有LIKE 模糊查询、ORDER BY 对结果集排序、运用聚合函数汇总结果以及 GROUP BY 子句与相关应用。 本文将继续使用《三国…

Java自学(三)面向对象编程

目录 什么是面向对象 举例 this关键字和构造器 实体类 电影小案例 什么是面向对象 我们日常生活中谈到一个事物&#xff0c;总会描述它的性质与行为&#xff0c;这个事物也就是 ”对象”。比如一个学生对象&#xff0c;他的属性有姓名、学号、成绩......他的行为有上课、…

opencv视频文件的读取,处理与保存

文章目录 opencv视频文件的读取&#xff0c;处理与保存一、视频文件的读取&#xff1a;1、cv::VideoCapture是OpenCV库中用于处理视频输入的类&#xff0c;它提供了一种简单的方法来从摄像头&#xff0c;视频文件、或图像序列中读取帧&#xff1b;&#xff08;1&#xff09;打开…

装饰器模式详解和实现(设计模式 二)

装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地将对象添加到现有对象中&#xff0c;以提供额外的功能&#xff0c;同时又不影响其他对象。 实现示例 1.定义一个接口或抽象类&#xff0c;表示被装饰对象的公共接口 //抽…

关于 自定义的RabbitMQ的RabbitMessageContainer注解-实现原理

概述 RabbitMessageContainer注解 的主要作用就是 替换掉Configuration配置类中的各种Bean配置&#xff1b; 采用注解的方式可以让我们 固化配置&#xff0c;降低代码编写复杂度、减少配置错误情况的发生&#xff0c;提升编码调试的效率、提高业务的可用性。 为什么说“降低…

QT编译报错stdlib.h:No such file or directory

如图&#xff0c;需要将第19行&#xff0c;INCLUDEPATH /usr/include 注释掉 原因分析&#xff1a; 在Ubuntu的CSTDLIB中&#xff0c;使用的是#include_next下“stdlib.h” &#xff0c;自行增加/usr/include 把include_next的顺序打乱&#xff0c;造成编译错误。但是在cento…

Ubuntu 20.04编译GPMP2过程记录

前言 GPMP2是董靖博士等人在16-17年提出的结合GTSAM因子图框架与Gaussian Processes完成motion planning的一项工作。前身源于Barfoot教授的课题组提出的STEAM(Simultaneous Trajectory Estimation and Mapping)问题及其相关工作。在提出董靖博士提出GPMP2后&#xff0c;borgl…

同步、异步

何为同步、异步&#xff1f; 同步任务&#xff08;synchronous&#xff09; 同步任务指的是&#xff0c;在主线程上排队执行的任务&#xff0c;只有前一个任务执行完毕&#xff0c;才能执行后一个任务&#xff1b;同步任务进栈顺序&#xff1a;先进后出&#xff0c;后进先出&…