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数据).不过没有克隆就可以做到吗?
不.但你可能有错误的想法:克隆一个Arc只是递增一个引用计数器并制作一个指针的副本; 它不执行任何分配.(编辑:当然,把东西放在一个Arc涉及分配,然后,你已经分配,以构建Vec,所以一个额外的固定大小分配不太可能受到伤害.)
(顺便说一句,如果您真正需要的只是长度,您可以在线程闭包之外计算它并将其存储在变量中; a usize跨越线程边界没有问题.)
问题是,目前,借入的词汇,所以即使如果有可能编译器从使用的推断join(),一个给定的线程被绑定到一个有限的寿命......它甚至没有尝试.
有是一个thread::scoped,允许您在不通过构造函数'static的引用,但不得不去稳定由于内存的安全问题.有一个替代品即将到来,但(从Rust 1.0开始,可能还有 1.1)还没有准备好.
所以现在,在安全或非夜间代码......不,你不能.