是否可以创建一个在运行时开始时分配一次然后跨线程借用的全局?
Is it possible to create a global that is assigned once at the beginning of runtime and then borrowed across threads?
lazy_static
不起作用,因为我需要在一些用户交互后在运行时分配给这个变量。 thread_local
不起作用,因为我需要跨线程读取此变量。
从系统的角度来看,我想我要做的应该很简单。在开始执行时我是单线程的,我初始化了一些东西,然后我 tokio::spawn
一些只需要读取那些东西的任务。
我可以通过使用互斥锁来解决这个问题,但是我真的不明白为什么我需要使用互斥锁,因为我可以保证除了在当我仍然在一个线程中时运行时的开始。有没有比使用互斥量更好的方法?
这是我目前的情况,以防有人好奇:
lazy_static! {
pub static ref KEYPAIRSTORE_GLOBAL: Mutex<KeypairStore> = Mutex::new(KeypairStore::new());
}
// ...
// at top of main:
let mut keypairstore = KEYPAIRSTORE_GLOBAL.lock().unwrap();
*keypairstore = KeypairStore::new_from_password();
// somewhere later in a tokio::spawn:
let keypair_store = KEYPAIRSTORE_GLOBAL.lock().unwrap();
let keypair = keypair_store.get_keypair();
println!("{}", keypair.address());
我不明白为什么我需要使用这个互斥...我很乐意在分配期间使用 unsafe
,但我不想每次都想用它阅读。
正如所写,您需要 Mutex
因为您在初始化后对其进行变异。相反,在初始化期间进行突变:
lazy_static! {
pub static ref KEYPAIRSTORE_GLOBAL: KeypairStore = {
let mut keystore = KeypairStore::new_from_password();
// ... more initialisation here...
keystore
}
}
// somewhere later in a tokio::spawn:
let keypair = KEYPAIRSTORE_GLOBAL.get_keypair();
println!("{}", keypair.address());
这是假设 get_keypair
的签名是:
pub fn get_keypair(&self) -> Keypair;
lazy_static
不起作用,因为我需要在一些用户交互后在运行时分配给这个变量。 thread_local
不起作用,因为我需要跨线程读取此变量。
从系统的角度来看,我想我要做的应该很简单。在开始执行时我是单线程的,我初始化了一些东西,然后我 tokio::spawn
一些只需要读取那些东西的任务。
我可以通过使用互斥锁来解决这个问题,但是我真的不明白为什么我需要使用互斥锁,因为我可以保证除了在当我仍然在一个线程中时运行时的开始。有没有比使用互斥量更好的方法?
这是我目前的情况,以防有人好奇:
lazy_static! {
pub static ref KEYPAIRSTORE_GLOBAL: Mutex<KeypairStore> = Mutex::new(KeypairStore::new());
}
// ...
// at top of main:
let mut keypairstore = KEYPAIRSTORE_GLOBAL.lock().unwrap();
*keypairstore = KeypairStore::new_from_password();
// somewhere later in a tokio::spawn:
let keypair_store = KEYPAIRSTORE_GLOBAL.lock().unwrap();
let keypair = keypair_store.get_keypair();
println!("{}", keypair.address());
我不明白为什么我需要使用这个互斥...我很乐意在分配期间使用 unsafe
,但我不想每次都想用它阅读。
正如所写,您需要 Mutex
因为您在初始化后对其进行变异。相反,在初始化期间进行突变:
lazy_static! {
pub static ref KEYPAIRSTORE_GLOBAL: KeypairStore = {
let mut keystore = KeypairStore::new_from_password();
// ... more initialisation here...
keystore
}
}
// somewhere later in a tokio::spawn:
let keypair = KEYPAIRSTORE_GLOBAL.get_keypair();
println!("{}", keypair.address());
这是假设 get_keypair
的签名是:
pub fn get_keypair(&self) -> Keypair;