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

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.lryc.cn/news/489230.html

相关文章:

  • 深入浅出学算法002-n个1
  • GPT1.0 和 GPT2.0 的联系与区别
  • STM32F103 GPIO和串口实战
  • Go 并发
  • C语言数据结构与算法--简单实现栈的出栈与入栈
  • 单片机智能家居火灾环境安全检测-分享
  • python FastAPI 后台运行
  • Java开发者必备:23种设计模式全面解析
  • 编译OpenWrt步骤
  • Linux:confluence8.5.9的部署(下载+安装+pojie)离线部署全流程 遇到的问题
  • ✅✅✅【Vue.js】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本
  • axios 请求跨域问题
  • 什么是 Faiss?
  • 24.UE5枚举,怪物分类,龙卷风技能
  • 什麼是ISP提供的公共IP地址?
  • git操作总结
  • CompressAI安装!!!
  • 豆包MarsCode算法题:最小周长巧克力板组合
  • vue项目添加骨架屏vue-skeleton-webpack-plugin,通过app.vue添加骨架屏,解决衔接空白问题
  • 测试实项中的偶必现难测bug之模糊匹配逻辑
  • Vue:后端返回二进制文件,前端如何实现浏览器自动下载?
  • Android解压zip文件到指定目录
  • 主要用于图像的颜色提取、替换以及区域修改
  • gbase8c之运维操作
  • 云原生学习
  • 深入解析 Vue 3 中的 defineExpose
  • Docker3:docker基础1
  • 【UGUI】背包的交互01(道具信息跟随鼠标+道具信息面板显示)
  • ubuntu20.04中编译安装gcc 9.2.0
  • ss 命令的基本用法