Rust Atomics and Locks 阅读笔记 第二章 Atomics

news/2024/11/6 13:41:27/
  1. 原子操作(atomic operations)是多线程实现的基石,互斥锁(mutex)和条件变量(condition variable)都是通过原子操作来实现;
  2. std::sync::atomic包括了rust的内置原子操作类型(如AtomicI32, AtomicUsize等),大部分依赖于硬件架构和操作系统来实现,几乎所有的平台(platform)都提供了至少在指针(pointer)级别的原子类型;
  3. 每个原子操作都有一个参数std::sync::atomic::Ordering,决定了我们想要这些原子操作内部进行的相对顺序,最宽松的顺序是Relaxed,在线程A里先对变量X做了写操作,然后迅速对变量Y做写操作,在Relaxed的顺序下,某线程B可能看到的顺序是先改变Y再改变X;
  4. load(&self, ordering: Ordering), store(&self)的第一个参数表示是一个共享引用(shared reference)&T而不是互斥引用(exclusive reference)&mut T,但是仍然可以改变T的值;
  5. Fetch-and-Modify操作把获取-更改作为一个原子操作,返回更改前的值;同时要注意fetch_add() 和 fetch_sub()实现了溢出行为(wrapping behaviour),具体实现详见Page37;
  6. !Page38给出了一个经典的move语义的编译器检查问题,for t in 0..4中t的生命周期与后面spawn的线程的生命周期的冲突问题,注意atomic类型没有实现Copy特征,但是实现了Sync,表示它的共享引用&T可以在多线程中传递;
  7. !Page41给出了一个生成唯一ID的用例,如何确保每次生成的ID唯一并且不溢出,第一个方案是当ID超过某个数字时使之Panic,通过assert,或者std::process::abort停掉该进程,第二个方案是同时用fetch_sub来减少ID的数值,第三个方案使用了compare-and-exchange操作;这里第一个方案正好是标准库中Arc::clone()用来处理borrow个数的方法,第二个方案是thread::scope用来处理一个scope中同时有多少个线程的ID的方法;
  8. compare_exchange(&self, expected:i32, new:i32, success_order: Ordering, failure_order:: Ordering)的签名比较复杂,但是可以用来实现所有其他的原子操作,Page43给了一个用compare_exchange来实现fetch_add的实例;
  9. 当ABA problem出现的时候,使用compare_exchange_weak()会更加有效,及时当前的值与expected相等,也有可能返回Err,这种情况是为了应对可能出现的欺骗性compare-and-exchange(也就是ABA问题,在load完成后的很短时间内,修改atomic的值后又修改回来,企图欺骗编译原值并没有变化,但实际上进行过变化);
  10. fetch_update()方法等同于load()之后使用一个loop计算更新值然后调用compare_exchange_weak来确保update的正确性,使用方法见Page45;
  11. Page46给出了一个情景使用compare_exchange()比使用compare_exchnage_weak()更高效;
  12. 使用std::sync::Oncestd::sync::OnceLock可以解决单例中generate_random_key()耗时过长但又不想重复调用的场景,确保某个静态变量只会初始化一次;

http://www.ppmy.cn/news/68084.html

相关文章

【C++入门编程常见问题】(小白必看)

常见问题 vsstudio快捷键 快速注释组合键 ctrlk ctrlc 取消注释快捷键 ctrlk ctrl u 支持垃圾回收机制 大多数面向对象编程语言具有垃圾回收机制。早期的C语言不具备垃圾回收机制,这意味着申请的内存资源在使用完成后,需要程序员自己释放。直到C11标…

搞懂 MyBatis 的事务管理机制

MyBatis 是一款优秀的持久层框架,相信很多 Java 后端开发人员对它都不会陌生。在实际项目开发中,事务管理是非常重要的一环,而 MyBatis 也为我们提供了便捷的事务管理机制。 本文将从以下方面详细解析 MyBatis 的事务管理机制: …

三十二、自定义镜像

1 、Docker镜像的原理 Docker镜像本质是什么? Docker中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G? Docker中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有10多MB? 操作系统组成部分: 计算机组成原理 进程调度子…

Java项目中常用的SON转换方式及示例

摘要: JSON(JavaScript Object Notation)是一种常用的数据交换格式,用于在不同的应用程序之间传输和存储数据。在Java开发中,我们经常需要将Java对象转换为JSON格式,或者将JSON转换回Java对象。本文将介绍几种常见的JS…

卫龙上市后首份财报:营收净利双降、去年净利下滑8成

当你吃辣条的时候,你在吃什么? 味道?口感?还是童年的记忆? 近日,卫龙美味全球控股有限公司(下称“卫龙”)发布了上市后的首份年报。 卫龙是一家辣味休闲食品的企业,根…

如何在 Mac 或 Windows 上将 PDF 转换为 Word 而不丢失格式

PDF 有无数的优点,但它不能像 Microsoft Word 文档那样容易编辑。如果您没有价格总是很高的 PDF 编辑器,您将无法根据需要编辑或使用 PDF 源。但是我们可以将PDF转成Word,方便编辑。 有很多解决方案可用于在 Mac 上将 PDF 转换为可编辑的 W…

〖Web全栈开发①〗—网络编程基础(上)

网络编程基础 网络编程网络编程概述TCP/IP协议IP地址什么是IPIP组成IP 地址使用过程查看IPIp地址分类:子网掩码 端口 socketSocket原理1.什么是Socket2.创建一个tcp socket(tcp套接字) tcp 介绍 🏘️🏘️个…

awk命令编辑

awk工作原理 逐行读取文本,默认以空格或tab键分隔符进行分隔,将分隔所得的各个字段保存到内建变量中,并按模式或者条件执行编辑命令。 sed命令常用于一整行的处理,而awk比较倾向于将一行分成多个“字段”然后再进行处理。awk信息…