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

阿里云腾讯云网站建设沧州网络运营公司

阿里云腾讯云网站建设,沧州网络运营公司,做网站更赚钱吗,做ui设计师难吗在实际项目开发中,难免需要用到全局变量,比如全局配置信息,全局内存池等,此类数据结构可能在多处需要被使用,保存为全局变量可以很方便的进行修改与读取。 在Rust中,如果只是读取静态变量是比较简单的&…

在实际项目开发中,难免需要用到全局变量,比如全局配置信息,全局内存池等,此类数据结构可能在多处需要被使用,保存为全局变量可以很方便的进行修改与读取。

在Rust中,如果只是读取静态变量是比较简单的,比如全局变量是一个usize或者& str等类型的值。如果全局变量是需要初始化产生的就比较复杂了,比如解析一个配置文件,然后把配置文件中的内容赋给全局变量。由于全局变量要被修改,这个全局变量得是可变的,也就是说产生了全局可变变量,而这种方式违反了Rust的设计原则。

一般方法

struct Config {id: u64,
}impl Config {fn new() -> Config {Config {id: 0,}}
}lazy_static::lazy_static! {static ref CACHE: Mutex<Config> = Mutex::new(Config::new());
}fn func1() {CACHE.lock().unwrap().id = 1;
}fn func2() {CACHE.lock().unwrap().id = 2;
}fn func3() -> u64 {return CACHE.lock().unwrap().id;
}fn main() {func1();let id1 = func3();println!("id1 = {}", id1);func2();let id2 = func3();println!("id2 = {}", id2);
}

这种方法一般可以满足需求,但是需要一开始就将变量初始化。
如果有未初始化的字段,可以使用Option等类型搞定。

更好的办法

use std::{sync::{OnceLock, RwLock},thread,time::Duration,
};struct AppData {count: i64,name: String,ptr: usize,
}static APP_SHARE: OnceLock<RwLock<AppData>> = OnceLock::new();fn th_loop1() {let app = APP_SHARE.get().unwrap();loop {{let app2 = app.read().unwrap();println!("th 1 read: {}", app2.count);if (app2.count > 60) {break;}}thread::sleep(Duration::new(1, 0));}println!("th 1 end!!");
}fn th_loop2() {let app = APP_SHARE.get().unwrap();loop {{let mut app2 = app.write().unwrap();app2.count += 1;println!("th 2 write: {}", app2.count);if (app2.count > 80) {break;}}thread::sleep(Duration::new(1, 0));}println!("th 2 end!!");
}fn main() {// 在这里初始化let app = APP_SHARE.get_or_init(|| {RwLock::new(AppData {count: 12 * 4 + 5,name: "abc".to_string(),ptr: (0xFF002403) as usize,})});{let app2 = app.read().unwrap();println!("init ok: {} {} {}", app2.count, app2.name, app2.ptr);}// 线程里面使用let t1 = thread::spawn(th_loop1);let t2 = thread::spawn(th_loop2);t1.join().unwrap();t2.join().unwrap();println!("===============");
}

这里的 AppData 一开始没有初始化,在程序运行时才进行。
能更好适应一般的全局变量需求!!

读多写少的情况,也可以这样:

use std::{cell::{Cell, RefCell},default,sync::{Arc, OnceLock, RwLock},thread,time::Duration,
};
struct T1 {a: i64,b: i64,
}
struct AppData {count: i64,name: String,ptr: usize,count2: RwLock<T1>,
}static APP_SHARE: OnceLock<AppData> = OnceLock::new();fn th_loop1() {let app = APP_SHARE.get().unwrap();loop {{let c2 = app.count2.read().unwrap();println!("th 1 read: {} {}", app.count, c2.a);if (app.count > 60 || c2.a > 10) {break;}}thread::sleep(Duration::new(1, 0));}println!("th 1 end!!");
}fn th_loop2() {let app = APP_SHARE.get().unwrap();loop {{let mut c2 = app.count2.write().unwrap();c2.a += 1;println!("th 2 write: {} {}", app.count, c2.a);if (app.count > 80 || c2.a > 20) {break;}}thread::sleep(Duration::new(1, 0));}println!("th 2 end!!");
}fn main() {// 在这里初始化let app = APP_SHARE.get_or_init(|| AppData {count: 12 * 4 + 5,name: "abc".to_string(),ptr: (0xFF002403) as usize,count2: RwLock::new(T1 { a: 1, b: 2 }),});{println!("init ok: {} {} {}", app.count, app.name, app.ptr);}// 线程里面使用let t1 = thread::spawn(th_loop1);let t2 = thread::spawn(th_loop2);t1.join().unwrap();t2.join().unwrap();println!("===============");
}
http://www.yayakq.cn/news/892706/

相关文章:

  • 建网站需要了解什么平台开发是做什么的
  • wordpress如何配置伪静态页面网站建设布局利于优化
  • 网站设计的收费高米店网站建设公司
  • 做打鱼网站的代理苏州实力做网站公司有哪些
  • 海南建设大厅网站杭州外贸网站多少钱
  • 石家庄免费建站模板网站建设网站维护网站外包
  • 做去自己的网站石家庄建设南大街小学网站
  • 网站问题图片爱站网 关键词挖掘工具站
  • 做网站中山贴吧 wordpress
  • 网站建设推广公司哪家好做的时间长的网站制作公司
  • 网站开发工程师ppt做网站报价明细表
  • 怎样做销售产品网站温州建设小学的网站
  • 开发手机网站用什么好处网站修改后怎么上传
  • 南宁建设职业技术学院招聘信息网站如何用记事本做网站
  • 教育网站模板下载wordpress 建站 教程视频
  • 企业商城建站简单的招聘网站怎么做
  • 班级网站制作建设的设计和作用国际新闻最新消息十条
  • 关键词库在网站上怎么体现兰州网站排名优化公司
  • 市场营销网站网站开发工程师需要什么技术
  • 互联网App网站建设方案网站建设合同定义
  • 白云网站 建设seo信科网站建设 台州
  • 住房城乡与建设厅网站首页网页设计实验报告课程建议
  • 成都前几年网站建设公司做网站有那几种末班
  • 回收网站怎么做深圳网页设计师公司
  • 开发一套app要多少钱做seo有什么好处
  • 网站正能量免费下载中交建设集团天津公司网站
  • 上海嘉定建设局官方网站青岛设计网站的公司哪家好
  • 网站建设明细价单深圳外贸公司上班工资高吗
  • 网站制作感受巴音郭楞网站建设
  • 湖州建设网站制作无锡建设网站