Rust: Send, Sync
Send 和 Sycn 是Rust安全并发的重中之重,但是实际上它们是只是标记特征(marker trait, 该特征末定义任何行为,因此非常适合用于标记),来看看它们的作用:
- 实现Send的类型可以在线程间安全的传递其所有权
- 实现Sync的类型可以在线程间安全的共享(通过引用)
这里还有一个潜在的依赖:一个类型要在线程间安全的共享的前提是,指向它的引用必须能在线程间传递。因为如果引用都不能被传递,我们就无法在多个线程间使用引用去访问同一个数据了。
一个类型T实现了Sync,那么&T就会实现Send,也就是:
impl<T: Sync + ?Sized> Send for &T {}
但是需要注意的是,&T和&mut T是两种不同的类型:
// 不存在的 impl <T: Sync + Sized?> Send for &mut T {}
相应的,只有实现了Send的类型T,才会有&mut T实现Send,即:
unsafe impl<T: Send + ?Sized> Send for &mut T {}