Rust:原子操作 AtomicBool

news2024/11/19 10:50:26

在 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.coloradmin.cn/o/2243346.html

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

相关文章

Linux之vim模式下全选命令

在Linux系统中,使用Vim编辑器进行全选操作可以通过以下几种方式实现: 1.使用键盘快捷键 按下 ”ggVG”(先按下”g”,再按下”g”,再按下”V”,最后按下”G”)可以全选当前文件内容。其中 ”g…

解决虚拟机未被自动分配ip

文章目录 1. 背景2. 解决步骤 1. 背景 从vulnhub下载的靶场文件,网络适配器模式设置为nat模式之后,启动虚拟机之后发现没有成功分配动态ip。推测是虚拟机分配的网卡名称和原先靶机作者设置网络配置文件 网络接口名称不一致导致。 2. 解决步骤 解决办法就…

【数据结构与算法】排序

文章目录 排序1.基本概念2.分类2.存储结构 一.插入排序1.1直接插入排序1.2折半插入排序1.3希尔排序 二.选择排序2.1简单选择排序2.2堆排序 三.交换排序3.1冒泡排序3.2快速排序 四.归并排序五.基数排序**总结** 排序 1.基本概念 排序(sorting)又称分类&…

5. ARM_指令集

概述 分类 汇编中的符号: 指令:能够编译生成一条32位机器码,并且能被处理器识别和执行伪指令:本身不是指令,编译器可以将其替换成若干条指令伪操作:不会生成指令,只是在编译阶段告诉编译器怎…

WPF MVVM框架

一、MVVM简介 MVC Model View Control MVP MVVM即Model-View-ViewModel,MVVM模式与MVP(Model-View-Presenter)模式相似,主要目的是分离视图(View)和模型(Model),具有低…

Java-03 深入浅出 MyBatis - 快速入门(无 Spring) 增删改查 核心配置讲解 XML 与 注解映射

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

Spring Cloud Alibaba [Gateway]网关。

1 简介 网关作为流量的入口,常用功能包括路由转发、权限校验、限流控制等。而springcloudgateway 作为SpringCloud 官方推出的第二代网关框架,取代了Zuul网关。 1.1 SpringCloudGateway特点: (1)基于Spring5,支持响应…

Debezium-EmbeddedEngine

提示:一个嵌入式的Kafka Connect源连接器的工作机制 文章目录 前言一、控制流图二、代码分析 1.构造函数2.完成回调3.连接器回调4.RUN总结 前言 工作机制: * 独立运行:嵌入式连接器在应用程序进程中独立运行,不需要Kafka、Kafka C…

阿里斑马智行 2025届秋招 NLP算法工程师

文章目录 个人情况一面/技术面 1h二面/技术面 1h三面/HR面 20min 个人情况 先说一下个人情况: 学校情况:211本中9硕,本硕学校都一般,本硕都是计算机科班,但研究方向并不是NLP,而是图表示学习论文情况&…

社交电商的优势及其与 AI 智能名片小程序、S2B2C 商城系统的融合发展

摘要:本文深入分析了社交电商相较于传统电商的优势,包括门槛低、易操作、更生活化和可团队化运作等特点。同时,探讨了 AI 智能名片小程序和 S2B2C 商城系统在社交电商发展中的作用,以及它们与社交电商融合所带来的新机遇和发展前景…

自动化运维-检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型等信息脚本

前言:以上脚本为今年8月1号发布的,当时是没有任何问题,但现在脚本里网络速度测试py文件获取不了了,测速这块功能目前无法实现,后面我会抽时间来研究,大家如果有建议也可以分享下。 脚本内容: #…

3D Streaming 在线互动展示系统:NVIDIA RTX 4090 加速实时渲染行业数字化转型

随着科技的飞速发展,实时渲染正逐步成为游戏与实时交互领域的重要驱动力。与离线渲染不同,实时渲染需要极高的计算性能,对硬件设备尤其是GPU的性能要求极高。随着 RTX 4090 显卡的问世,其强大的算力和创新技术,为实时渲…

南京邮电大学《智能控制技术》课后作业

一、问题一 复现二输入单输出模糊控制系统,改动其中一到两个环节(隶属度设置、规则等),对比修改前后控制效果。 定义模糊 %Fuzzy Control for water tank clear all; close all;anewfis(fuzz_tank);%Fuzzy Inference System stru…

2.5D视觉——Aruco码定位检测

目录 1.什么是Aruco标记2.Aruco码解码说明2.1 Original ArUco2.2 预设的二维码字典2.3 大小Aruco二维码叠加 3.函数说明3.1 cv::aruco::detectMarkers3.2 cv::solvePnP 4.代码注解4.1 Landmark图说明4.2 算法源码注解 1.什么是Aruco标记 ArUco标记最初由S.Garrido-Jurado等人在…

栈Stack和队列Queue

目录 一、栈 (1)用数组实现 (2)用单链表实现 (3)用标注尾结点的单链表实现 (4)用双向链表实现 2、栈的实际应用 (1)改变元素的序列 (2&am…

Tailscale 自建 Derp 中转服务器

文章目录 为什么要建立 Derp 中转服务器?安装 Go 环境通过 Go 安装 Derp处理证书文件自签一个域名启动 DerpIPV6 的支持防止 Derp 被白嫖以上的操作命令合集自建 Headscale 添加 Derp参考 为什么要建立 Derp 中转服务器? Tailscale 使用的算法很有趣: 所…

RPC安全可靠的异常重试

当调用方调用服务提供方,由于网络抖动导致的请求失败,这个请求调用方希望执行成功。 调用方应该如何操作?catch异常再发起一次调用?显然不够优雅。这时可以考虑使用RPC框架的重试机制。 RPC框架的重试机制 RPC重试机制&#xff1…

AutoDL部署视觉大模型llama3.2-vision,从视频中寻找特定目标

注: windows11系统。示例为此项目:https://github.com/win4r/VideoFinder-Llama3.2-vision-Ollama 在当今的人工智能领域,深度学习模型的计算需求日益增长,特别是在处理复杂的视觉任务时,强大的算力往往是实现高效应用…

【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法

【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法 目录 文章目录 【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法目录摘要:研究背景:问题与挑战:如何解…

golang调用模组程序实现交互输入自动化,获取imei及iccid

应用场景:在openwrt下调用移远的测试程序,并实现输入自动话,获取imei rootOpenWrt:~# ql-api-test Test groups:0: ql_dsi1: ql_nw2: ql_sim3: ql_dev4: ql_voice5: ql_sms6: ql_adc7: ql_i2c8: …