前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Rust工具集之arc-swap

Rust工具集之arc-swap

作者头像
newbmiao
发布于 2024-06-14 06:23:14
发布于 2024-06-14 06:23:14
23900
代码可运行
举报
文章被收录于专栏:学点Rust学点Rust
运行总次数:0
代码可运行

Rust中常有配置读写的操作,一般可以用Arc<RwLock<T>>来实现,也可以用arc-swap来。有什么不同?

下面拿一个例子来说明下

假设有个配置,会有一个 read thread 不断获取配置,配置更新时要实时反映出来。

文章目录

  • RwLock
  • arc-swap

RwLock

RwLock实现一下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use std::sync::{Arc, RwLock};
use std::thread;
use std::time::Duration;

fn main() {
    let config = Arc::new(RwLock::new("Initial Config".to_string()));
    let shared_config = Arc::clone(&config);

    let reader_thread = {
        thread::spawn(move || loop {
            // 1. read config
            let current_config = shared_config.read().unwrap();
            println!("Reader thread: {}", *current_config);
            thread::sleep(Duration::from_secs(2));
        })
    };

    // Update the configuration after 1s
    thread::sleep(Duration::from_secs(1));

    println!("Updating config");
    // 2. write config
    let mut current_config = config.write().unwrap();
    *current_config = "Updated Config".to_string();
    println!("Updating config done");
    reader_thread.join().unwrap();
}

但如果你执行会发现,2 修改配置后,1 读取配置还是没有变化,而且不会打印Updating config done, 为啥呢?

这里其实是一个错误示范,RwLock读会持有锁,如果不释放锁,可以加多个读锁,但是不能获取写锁来修改。

修改代码,用作用域来释放锁

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 1. read config
{
    let current_config = shared_config.read().unwrap();
    println!("Reader thread: {}", *current_config);
}

...
// 2. write config
{
    let mut current_config = config.write().unwrap();
    *current_config = "Updated Config".to_string();
    println!("Updating config done");
}

现在结果就满足预期了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Reader thread: Initial Config
Updating config
Updating config done
Reader thread: Updated Config
...

arc-swap

这样使用RwLock修改配置需要注意锁的持有和释放,本质上是无法原子操作读写,导致代码实现上不够友好,也容易写出死锁的代码。

arc-swap主要就是为了优化这点,原子操作资源,让你可以直接编写读写操作而无需顾虑锁。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
use arc_swap::ArcSwap;
use std::sync::Arc;
use std::thread;
use std::time::Duration;

fn main() {
    let config = Arc::new("Initial Config".to_string());
    let shared_config = Arc::new(ArcSwap::new(config));

    let reader_thread = {
        let shared_config = Arc::clone(&shared_config);
        thread::spawn(move || loop {
            let current_config = shared_config.load();
            println!("Reader thread: {}", current_config);
            thread::sleep(Duration::from_secs(1));
        })
    };

    thread::sleep(Duration::from_secs(2));

    let new_config = Arc::new("Updated Config".to_string());
    shared_config.store(new_config);

    reader_thread.join().unwrap();
}

怎么样,代码是不是直截了当了许多?

一般很多读多写少的场景都可以试试arc-swap

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 菜鸟Miao 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【Rust日报】2022-09-09 攻击 Firecracker
来自 Grapl 的博客文章。在 Grapl,我们相信为了构建最好的防御系统,我们需要深入了解攻击者的行为。作为该目标的一部分,我们正在投资于进攻性安全研究。随时关注我们的博客,了解有关高风险漏洞、利用和高级威胁策略的新研究。
MikeLoveRust
2022/11/28
3240
Rust学习笔记Day18 智能指针Cow/MutexGuard
这是用于提供写时克隆(Clone-on-Write)的一个智能指针,和虚拟内存管理的写时复制很像。
用户1072003
2023/02/23
7190
Rust学习笔记Day18 智能指针Cow/MutexGuard
聊聊共享所有权之Rc和Arc
像如下代码,字符串a如果直接移动给b后就没法后边再去打印,因为它的所有权已经转移给了b。
newbmiao
2023/11/27
3560
聊聊共享所有权之Rc和Arc
【Rust每周一知】Rust中的读写锁RwLock
在计算机科学中,有一些经典的同步问题,读者-作家问题就是其中一个,该问题涉及多个并发线程试图同时访问同一共享资源的情况。
MikeLoveRust
2020/04/07
4.7K0
Rust 中的 QUIC 实现 --- quinn
QUIC 是基于 UDP 的多路复用、安全传输协议。可以简单理解为在用户空间将 TCP 里的机制实现了一遍,比如拥塞控制、流量控制等。好处是升级比较方便,TCP 协议栈是内核中实现的,只能随内核升级,而 QUIC 可灵活升级。
谛听
2022/01/30
4.2K0
【Rust 日报】2022-06-19 Rust 1.63 新特性令人期待
Rust 标准库 1.63 增加了一个期待已久的功能:scoped thread(作用域线程)。与 thread::spawn() 不同,这个新特性允许线程借用局部变量,而不仅仅是静态变量。借用官方例子:
MikeLoveRust
2022/11/28
4650
【Rust 日报】2022-06-19 Rust 1.63 新特性令人期待
【大家的项目】可 Deferred 就绪的 Future 实现类
改变当前Future对象的Polling状态从Poll::Pending至Poll::Ready<T>。这个痛点是futures crate都没有照顾到的。
MikeLoveRust
2023/10/30
2690
【大家的项目】可 Deferred 就绪的 Future 实现类
【Rust 基础篇】Rust 互斥器(Mutex)
在 Rust 中,互斥器(Mutex)是一种用于在多个线程之间共享数据的并发原语。互斥器提供了一种安全的方式,允许多个线程访问共享数据,但每次只允许一个线程进行写操作。本篇博客将详细介绍 Rust 中互斥器的使用方法,包含代码示例和对定义的详细解释。
繁依Fanyi
2023/10/12
4930
Rust入坑指南:齐头并进(上)
我们知道,如今CPU的计算能力已经非常强大,其速度比内存要高出许多个数量级。为了充分利用CPU资源,多数编程语言都提供了并发编程的能力,Rust也不例外。<!-- more -->
Jackeyzhe
2020/03/22
1.2K0
RUST练习生如何在生产环境构建万亿流量|得物技术
在《得物新一代可观测性架构:海量数据下的存算分离设计与实践》一文中,我们探讨了存算分离架构如何通过解耦计算与存储资源,显著降低存储成本并提升系统扩展性。然而,仅优化存储成本不足以支撑高效可观测性系统的全局目标。在生产环境中,计算层作为可观测性体系的核心模块,需在处理日益复杂和动态的大流量数据时,保持高性能、强稳定性与优异的资源利用效率。
得物技术
2025/01/21
1050
RUST练习生如何在生产环境构建万亿流量|得物技术
【翻译】200行代码讲透RUST FUTURES (7)
我们将用一个伪reactor和一个简单的执行器创建我们自己的Futures,它允许你在浏览器中编辑和运行代码
MikeLoveRust
2020/08/05
1.3K0
Rust语法之多线程(Tokio)
该示例代码创建了一个包含 9 个元素的 Vec,然后使用 Arc 和 Mutex 包装了该 Vec。接着,我们创建了 3 个线程,每个线程负责修改 Vec 的三分之一元素的值。在每个线程的执行体中,我们使用 Mutex 来获取 Vec 的写锁,并修改 Vec 中的元素。最后,我们等待所有线程完成,并输出修改后的 Vec。
码客说
2023/04/17
1.9K0
Rust并发控制之Condvar
上次提到的 Barrier 用到了 Rust 的 condvar 和 mutex,今天来看下 condvar 的用法。
newbmiao
2023/11/27
4150
Rust并发控制之Condvar
【Rust 基础篇】Rust 多线程:并发编程的艺术
多线程是现代计算机编程中的重要概念,它允许程序同时执行多个任务,充分利用多核处理器的性能优势。在 Rust 中,多线程编程也得到了很好的支持,通过标准库提供的 std::thread 模块可以方便地创建和管理线程。本篇博客将详细介绍 Rust 中多线程的使用方法,包含代码示例和对定义的详细解释。
繁依Fanyi
2023/10/12
1.4K0
【Rust每周一库】smol - 异步rumtime
smol是一个轻量而高效的异步runtime。它采用了对标准库进行扩展的方式,整个runtime只有大约1500行代码。作者stjepang大神是大名鼎鼎crossbeam的作者。而他之前参与tokio和async-std的开发的经验和思考,产生出了从头开始构建的smol这个库。实际上在达到和tokio以及async-std相似的性能的前提下,smol代码短线精悍,完全没有依赖mio库,API更加简单,并且没有unsafe代码!而且,它还兼容tokio和async-std。让我们看个简单的例子
MikeLoveRust
2020/05/14
1.2K0
使用Rust构建一个kvm用户空间实例
最近在学习虚拟化相关的内容,想着使用Rust构建一个最小的kvm用户空间实例。也就是直接调用kvm的api,然后创建虚拟机。网络上关于kvm的内容大部分是使用libvirt的,然后kvm用户空间实例也是使用C编写的。因此想着使用Rust写一个简单的。
灯珑LoGin
2023/10/18
3110
使用Rust构建一个kvm用户空间实例
【Rust每周一知】如何理解Rust的默认线程安全?
本文以Rc和RefCell为例,讨论Rust中的Send和Sync是如何保证线程安全的。
MikeLoveRust
2020/02/12
1.5K0
深入理解Rust的Atomic及Ordering
之前提到的Mutex、Condvar是Rust中比较偏高层的共享数据型并发控制,更底层的并发控制也有,比如Atomic(原子操作)。
newbmiao
2023/12/26
6030
深入理解Rust的Atomic及Ordering
rust的并发编程
并发的方式 多进程 多线程 协程 多线程遇到的问题 数据竞争 内存不安全和未定义的行为 常用的两种线程模型(rust都支持) 锁管理临界区 消息通信 rust的并发 通过后thread::spawn关键字 自定义线程通过Builder::new 线程从并发模型 数据共享 Rrc实现变量-可以读,但是没法修改 互斥mutex。 arc和mutex。共享变量 支持读写锁RwLock 通过消息通信 mpse模块 channel和sync_channel rust中的线程安全 parking_lot检查死锁 保证安
李子健
2022/05/14
4380
Rust常用并发示例代码
如果method1()被多次调用,就会创建多个线程,如果希望不管调用多少次,只能有1个线程,在不使用线程池的前提下,有1个简单的办法:
菩提树下的杨过
2022/09/28
1K0
Rust常用并发示例代码
相关推荐
【Rust日报】2022-09-09 攻击 Firecracker
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验