在Rust中分享线程之间的可变变量

Eva*_*van 7 multithreading rust

是否可以在Rust中的多个线程之间共享一个可变变量?鉴于以下内容:

fn main() {

    let mut msg = "Hi";
    // ...
    msg = "Hello, World!";

    do spawn {
        println(msg);
    }

    do spawn {
        println(msg);
    }

}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

错误

该变量只需要对生成的线程只读.变量必须是可变的,因为我真正想要做的是在多个线程之间共享一个HashMap.据我所知,除非它是可变的,否则无法填充HashMap.即使有办法做到这一点,我仍然有兴趣知道如何完成这样的事情.

谢谢!

小智 9

此限制将在该语言的未来版本中删除.也就是说,您可以let msg = msg;在第一个问题之前解决此问题do spawn.这会将值移动msg到不可变的位置,从而有效地改变其可变性.

  • 当你说“这个限制将被取消”时,到底发生了什么变化?捕获时复制将成为默认设置?或者,只要您的 lambda 是在最后一次赋值后创建的,您就能够捕获可变变量? (2认同)

Pau*_*fer 6

“一般”答案(关于在共享时保持哈希表可变)是它不是直接可能的;Rust 专门设计用于禁止共享可变状态,以避免某些类型的错误并保护某些类型的安全(以及其他原因)。

但是,可以创建类似于共享可变哈希表的东西。想象一下单个任务有一个可变的哈希表。您可以编写代码,以便其他任务可以向它发送消息,本质上是“更新哈希表,以便 5 映射到 18”或“告诉我 7 映射到什么”。

这个间接实现了什么?首先,通过将值复制到消息中,另一个任务不可能践踏您正在阅读的所有内存(这是一个很大的安全问题),其次,通过间接编写代码,对程序员来说更清楚什么是原子操作,什么不是原子操作;程序员会知道不要期望关于哈希表内容的两个连续消息不一定是关于相同版本的哈希表,这个假设对于两个连续读取是完全有效的(至少在 Rust 中,由于一些其他限制)来自非共享的、可变的哈希表。