当前位置: 首页 > article >正文

Rust:原子操作 AtomicBool

在 Rust 中,你可以使用 std::sync::atomic 模块来进行原子操作。原子操作在多线程环境中特别有用,因为它们可以确保操作的原子性和可见性,从而避免数据竞争和其他并发问题。

为了读取和设置布尔值,你可以使用 AtomicBool 类型。以下是一个简单的示例,展示了如何使用 AtomicBool 来读取和设置布尔值:

rust
use std::sync::atomic::{AtomicBool, Ordering};

fn main() {
// 创建一个新的 AtomicBool,初始值为 false
let atomic_bool = AtomicBool::new(false);

// 设置 AtomicBool 的值为 true
atomic_bool.store(true, Ordering::Relaxed);

// 读取 AtomicBool 的值
let value = atomic_bool.load(Ordering::Relaxed);
println!("The value of atomic_bool is: {}", value);

// 使用 compare_and_swap 方法,如果当前值为 true,则将其设置为 false,并返回旧值
let old_value = atomic_bool.compare_and_swap(true, false, Ordering::Relaxed);
println!("The old value of atomic_bool was: {}", old_value);

// 再次读取值以确认更改
let new_value = atomic_bool.load(Ordering::Relaxed);
println!("The new value of atomic_bool is: {}", new_value);

// 使用 swap 方法,将值设置为 true 并返回旧值
let swapped_value = atomic_bool.swap(true, Ordering::Relaxed);
println!("The swapped value of atomic_bool was: {}", swapped_value);

}
解释
创建 AtomicBool:
rust
let atomic_bool = AtomicBool::new(false);
这创建了一个新的 AtomicBool 实例,初始值为 false。

设置值:
rust
atomic_bool.store(true, Ordering::Relaxed);
使用 store 方法将 AtomicBool 的值设置为 true。Ordering::Relaxed 表示内存排序约束较弱,适用于不需要严格排序的场景。

读取值:
rust
let value = atomic_bool.load(Ordering::Relaxed);
使用 load 方法读取 AtomicBool 的当前值。

比较并交换:
rust
let old_value = atomic_bool.compare_and_swap(true, false, Ordering::Relaxed);
compare_and_swap 方法会检查当前值是否为 true,如果是,则将其设置为 false 并返回旧值。

再次读取值:
rust
let new_value = atomic_bool.load(Ordering::Relaxed);
再次读取值以确认更改。

交换值:
rust
let swapped_value = atomic_bool.swap(true, Ordering::Relaxed);
swap 方法将值设置为 true 并返回旧值。

内存排序 (Ordering)
在原子操作中,内存排序 (Ordering) 决定了操作的内存可见性和顺序。常见的选项包括:

Ordering::Relaxed:最弱的排序约束,适用于不需要严格排序的场景。
Ordering::Acquire:在读取操作之前获取所有权。
Ordering::Release:在写入操作之后释放所有权。
Ordering::SeqCst:顺序一致性,最强的排序约束,确保所有线程以相同的顺序看到操作。
选择适当的内存排序约束可以提高性能,但也要确保满足你的并发需求。


http://www.kler.cn/a/399494.html

相关文章:

  • Ubuntu 18.04 配置sources.list源文件(无法安全地用该源进行更新,所以默认禁用该源)
  • 241113.学习日志——[CSDIY] [ByteDance] 后端训练营 [02]
  • Unity3D 完整直升机控制器(虚拟仿真级别)
  • linux虚拟机无法使用yum在线拉取
  • Flutter:Dio下载文件到本地
  • VSCode插件
  • 基本数据类型和包装类型的区别、缓存池、自动拆箱装箱(面试题)
  • JVM堆(1.6、1.7、1.8)
  • 【route】route add命令详解
  • 2023年MathorCup数学建模B题城市轨道交通列车时刻表优化问题解题全过程文档加程序
  • PHP 语法基础
  • 电商系统开发:Spring Boot框架实战
  • Java | Leetcode Java题解之第564题寻找最近的回文数
  • 关于网络安全里蜜罐的详细介绍
  • 机器学习———特征工程
  • 使用Python和BeautifulSoup进行网页抓取:通过Python编程语言,结合BeautifulSoup库,可以轻松地从网站上抓取所需的信息。
  • TCP协议(一)
  • 【Golang】——Gin 框架简介与安装
  • <项目代码>YOLOv8 番茄识别<目标检测>
  • Towards Reasoning in Large Language Models: A Survey
  • OpenGL 进阶系列09 - 计算着色器
  • 力扣整理版七:二叉树(待更新)
  • 小程序-基于java+SpringBoot+Vue的驾校预约平台设计与实现
  • windbg 关于L10比L9多更多行,和poi的含义
  • 【Linux---09】Crontab定时调度
  • 【C++】哈希表的实现详解