参考上一篇《初学rust,如何实现在运行时对全局变量设置和读取》,文章中说,可以用OnceCell
来定义全局变量,然后就可以对全局变量进行读写,实际上,我发现OnceCell
的set()
方法只能调用一次,如果你试图第二次调用set()
来修改已经设定好的值,将会报错,设置值就失败了。
由于这一切都是为了读写的并发安全。所以OnceCell
是无法实现读写全局变量的。要实现读写全局变量,应该使用RwLock
。如下
定义全局变量
static WORKER_PID: RwLock<Option<u32>> = RwLock::new(None);
读写全局变量
// 写入
fn store_worker_pid(pid: u32) {
let mut data = WORKER_PID.write().unwrap();
*data = Some(pid);
}
// 读取
let data = WORKER_PID.read().unwrap();
let cpid = data.unwrap();
这里的读写就可以多次进行了。可以看到,这里使用了读写锁,写的时候会先通过write()
方法获取写入锁实例,然后对其赋值写入。读取的时候会先通过read()
方法获取读取锁实例,然后取里面的值。这样一来就实现了全局变量的读写。