是否可以创建一个在运行时开始时分配一次然后跨线程借用的全局?

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;