首页 > 其他分享 >rust使用lazy_static对全局变量多线程并发读写示例

rust使用lazy_static对全局变量多线程并发读写示例

时间:2024-01-25 11:45:26浏览次数:24  
标签:lazy 示例 get unwrap static shared 多线程 data

首先需要在项目依赖Cargo.toml添加lazy_static依赖项

[dependencies]
lazy_static = "1.4.0"

示例代码如下:

use lazy_static::lazy_static;
use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
use std::thread;

#[derive(Debug)]
struct SharedData {
    data: Vec<u8>,
}

lazy_static! {
    static ref GLOBAL_DATA: RwLock<SharedData> = RwLock::new(SharedData { data: Vec::new() });
}

fn get_write_shared_data() -> RwLockWriteGuard<'static, SharedData> {
    GLOBAL_DATA.write().unwrap()
}

fn get_read_shared_data() -> RwLockReadGuard<'static, SharedData> {
    GLOBAL_DATA.read().unwrap()
}

fn main() {
    // 读取最初的数据
    thread::spawn(|| {
        let shared_data = get_read_shared_data();
        println!("{:?}", shared_data);
    })
    .join()
    .unwrap();

    // 添加一个元素
    thread::spawn(|| {
        let mut shared_data = get_write_shared_data();
        shared_data.data.push(42);
    })
    .join()
    .unwrap();

    // 读取修改后的数据
    thread::spawn(|| {
        let shared_data = get_read_shared_data();
        println!("{:?}", shared_data);
    })
    .join()
    .unwrap();

    // 移除一个元素
    thread::spawn(|| {
        let mut shared_data = get_write_shared_data();
        shared_data.data.retain(|&x| x != 42);
    })
    .join()
    .unwrap();

    // 读取修改后的数据
    thread::spawn(|| {
        let shared_data = get_read_shared_data();
        println!("{:?}", shared_data);
    })
    .join()
    .unwrap();
}

 

标签:lazy,示例,get,unwrap,static,shared,多线程,data
From: https://www.cnblogs.com/ALXPS/p/17986792

相关文章

  • jmeter读取csv文件控制多线程不重复读取
    在Jmeter中设置并发为S,循环次数为N时,参数化文件可能被重复读取N次,无法保证每次读取的数据均不一样,此处介绍保证数据不重复的方法。在线程组下添加一个CSVDataSetConfig,具体配置如下图:将配置中默认:RecycleonEOF=True,StopthreadonEOF=False修改为:RecycleonEO......
  • Python requests模块POST提交请求,不同Content-type对应的参数示例
    1.'content-type':'application/x-www-form-urlencoded'data参数提交文本或字典都可以headers为空时,data提交content-type默认也是application/x-www-form-urlencodedrequests.post(url,headers={'content-type':'application/x-www-form-urlencoded'}......
  • 用C++11打造智能观察者模式:详解实现步骤完整示例代码
     观察者模式是一种行为设计模式,其中一个对象(主题)维护其依赖对象(观察者)的列表,当主题的状态发生变化时,它通知所有观察者。以下是一个使用C++11实现观察者模式的简单例子:定义观察者接口(Observer): 创建一个观察者接口,该接口包含观察者需要实现的更新方法。这个接口可以包含其他......
  • Java 多线程交替打印
    目录题目方案一:synchronized方法二:ReentrantLock方法三:ReentrantLock+Condition(非公平锁)方法四:ReentrantLock+Condition(公平锁)方法五:Semaphore题目使用三个线程T1、T2、T3,如何让他们按顺序交替打印10次ABC。方案一:synchronizedpublicclassSynchronizedLockPrint......
  • 支付宝:多线程事务怎么回滚?说用 @Transactional 可以回去等通知了!
    1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆分数据并行处理来提高响应时间,如果有一个线程执行失败,则全部回滚。2,在spring中可以使用@Transactional注解去控制事务,使出现异常时会进行回滚,在多线程......
  • std::function类的使用示例
    std::function是C++标准库中的一个模板类,用于封装可调用的目标,比如函数、函数指针、成员函数指针、Lambda表达式等,使得它们可以像普通函数一样被调用。这种灵活性使得std::function在许多场景下都非常有用。以下是std::function的一般用法:1.封装函数指针1.1不带参数和返回值......
  • 华为三层交换机与路由器配置上网示例——学会这个,你就是IT界大佬
    特性配置案例适用的产品和版本说明本手册适用于通过命令行配置的框式交换机和盒式交换机(S300、S500、S2700、S3700、S5700、S6700、S7700、S7900、S9700共用一套)的多个版本,每个案例所支持的产品和版本不同,每个案例适用产品和版本请参看具体页面中的“配置注意事项”。若无特殊说明,......
  • IPC-MQ-代码示例
    客户端-服务端版本一Codeintcommom_msg(intmsgFlag){ //生成IPC关键字 key_tk=ftok(PATHNAME,PROJ_ID); //获取消息队列ID intmsgId=msgget(k,msgFlag); if(msgId<0) { perror("msggeterror"); return-2; } returnmsgId;}intget_msg(void)......
  • python多线程id获取
    demoimportthreadingimporttimedefprint_thread_info(thread_name):"""线程函数,打印线程名称和ID以及一些文本"""foriinrange(3):time.sleep(1)thread_id=threading.current_thread().identprint(f"{thr......
  • Optional类的使用示例
    Optional类是Java8中引入的一个新特性,它可以用来解决空指针异常的问题。在之前的版本中,如果一个方法返回的结果有可能为空,我们通常需要在使用该结果之前进行判空操作,以避免出现NullPointerException。而使用Optional类可以更加简洁和安全地处理这种情况。下面是一个使用Optional......