0

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在分配期间使用它,但我不想每次我想阅读时都使用它。

4

1 回答 1

3

如所写,您需要它,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;
于 2021-08-02T15:15:45.910 回答