根据documentation,如果Vec<T>
实现Sync
,则T
实现Sync
。看来它是由某种魔术自动生成的,但是我觉得这是违反直觉的,因为矢量的幼稚实现不是线程安全的。
Rust中的Vec<T>
真的是Sync
吗?
答案 0 :(得分:6)
实现Sync
意味着一种类型可以保证在线程之间可以共享对其值的引用,而不会在安全Rust中引起数据争用的风险。
类型&Vec<T>
的值是不可变的,因此共享它们总是安全的。 Rust借用检查器已经禁止与该对象的任何其他引用同时存在可变引用,因此,由于Rust的借用规则,该引用会自动工作。共享Vec
时,任何事物都无法对其进行突变,因此不可能进行数据竞争。当然,如果图片中出现unsafe
代码,那么保证就消失了。
实际上大多数类型是Sync
。那些不是(例如RefCell
)的引用倾向于具有内部可变性,或者在编译时借阅检查器无法控制的范围内管理引用。