是否可以在没有任何克隆的情况下与线程共享数据?

Joh*_*off 8 multithreading rust borrow-checker

通常,当我将工作委托给线程时,我有一段数据将比所有线程更长.一个例子是numbers在下面的例子:

use std::thread;

fn main() {
    let numbers = vec![1, 2, 3];

    let thread_a = thread::spawn(|| println!("{}", numbers.len()));
    let thread_b = thread::spawn(|| println!("{}", numbers.len()));

    thread_a.join().unwrap();
    thread_b.join().unwrap();
}
Run Code Online (Sandbox Code Playgroud)

它没有在任何地方修改,并且由于joins,它保证线程使用它完成.但是,Rust的借阅检查员无法分辨.

到目前为止,我看到的解决方案都涉及克隆数据(或克隆Arc数据).不过没有克隆就可以做到吗?

DK.*_*DK. 5

不.但你可能有错误的想法:克隆一个Arc只是递增一个引用计数器并制作一个指针的副本; 它不执行任何分配.(编辑:当然,把东西放在一个Arc涉及分配,然后,你已经分配,​​以构建Vec,所以一个额外的固定大小分配不太可能受到伤害.)

(顺便说一句,如果您真正需要的只是长度,您可以在线程闭包之外计算它并将其存储在变量中; a usize跨越线程边界没有问题.)

问题是,目前,借入的词汇,所以即使如果有可能编译器从使用的推断join(),一个给定的线程被绑定到一个有限的寿命......它甚至没有尝试.

一个thread::scoped,允许您在不通过构造函数'static的引用,但不得不去稳定由于内存的安全问题.有一个替代品即将到来,但(从Rust 1.0开始,可能还有 1.1)还没有准备好.

所以现在,在安全或非夜间代码......不,你不能.