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:顺序一致性,最强的排序约束,确保所有线程以相同的顺序看到操作。

选择适当的内存排序约束可以提高性能,但也要确保满足你的并发需求。

相关推荐
黑客-雨10 分钟前
从零开始:如何用Python训练一个AI模型(超详细教程)非常详细收藏我这一篇就够了!
开发语言·人工智能·python·大模型·ai产品经理·大模型学习·大模型入门
Pandaconda15 分钟前
【Golang 面试题】每日 3 题(三十九)
开发语言·经验分享·笔记·后端·面试·golang·go
半盏茶香16 分钟前
扬帆数据结构算法之雅舟航程,漫步C++幽谷——LeetCode刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
数据结构·c++·算法
加油,旭杏19 分钟前
【go语言】变量和常量
服务器·开发语言·golang
行路见知19 分钟前
3.3 Go 返回值详解
开发语言·golang
xcLeigh23 分钟前
WPF实战案例 | C# WPF实现大学选课系统
开发语言·c#·wpf
NoneCoder33 分钟前
JavaScript系列(38)-- WebRTC技术详解
开发语言·javascript·webrtc
CodeJourney.36 分钟前
小型分布式发电项目优化设计方案
算法
关关钧44 分钟前
【R语言】数学运算
开发语言·r语言
十二同学啊1 小时前
JSqlParser:Java SQL 解析利器
java·开发语言·sql