与另一个线程共享对象而不使用“move”

问题描述 投票:0回答:1

如何安全地将这个

response.audio_file
分享到其他线程?

thread::spawn(move || {
    prepare_result_files(&response.audio_file);
});
//prepare_result_files(&response.audio_file).await;
Ok(response) // Doesn't work because 

我尝试实现 AudioFile 的 Copy 特征,但后来我不能,因为类型的 mosf 无法实现 Copy 特征:

#[derive(Serialize, Deserialize, Debug)]
#[tsync]
pub struct AudioFile {
    pub id: i32,
    pub name: String,
    pub status: Status,
    pub results: Option<Vec<ResultFile>>,
}

有什么指点吗?

multithreading rust thread-safety
1个回答
0
投票

您可以使用 Arc 和读写锁。

https://doc.rust-lang.org/std/sync/struct.Arc.html

https://doc.rust-lang.org/stable/std/sync/struct.RwLock.html

所以

#[derive(Serialize, Deserialize, Debug)]
#[tsync]
pub struct AudioFile {
    pub id: i32,
    pub name: String,
    pub status: Status,
    pub results: Option<Vec<ResultFile>>,
}

你应该将整个响应包裹在一个 Arc 中

let response = Arc::new(RwLock::new(audio_file));

let response_clone = Arc::clone(&response);

thread::spawn(move || {
    let audio_file = response_clone.read().await.unwrap();
    prepare_result_files(&audio_file);
})

请注意,您将获得audio_file的只读副本 如果您选择,可以使用 .write() 代替,但是,这将锁定文件,直到锁被释放。

© www.soinside.com 2019 - 2024. All rights reserved.