还没有Send
/ Sync
吗?官方文件只提到它与数据竞赛有关。
答案 0 :(得分:5)
由于记忆安全。
考虑这个例子(忽略这一事实,如果它编译会导致无限循环):
let mut list = vec![1, 2, 3];
for item in &list {
list.push(*item + 1);
println!("item = {}", item);
}
item
是对list
所拥有的记忆的引用;它的类型为&i32
。您可以通过解除引用(*item
)来读取该元素的值。
如果item
调用要将向量的内存重新分配到其他地址,push
中的引用会怎样?
然后,引用将包含旧地址。任何访问它的尝试都将涉及读取一些未定义的内存块。这违反了Rust的核心安全原则。
还没有
Send
/Sync
Send
和Sync
关注多个线程。从上面的示例中可以看出,您不需要线程来产生无效的引用。