Rust的并发模型并不是语言本身提供了,而是属于标准库。由于不需要语言提供并发相关的基础设施,所以并发方案不受标准库或语言限制:可以编写自己的或者使用别人编写的并发功能。
不过由两个并发概念是内嵌于语言中的:std::marker中的Sync和Send trait。
Send允许在线程间转移所有权
实现了Send trait的类型的值的所有权可以在线程间传送。几乎所有的Rust类型都是Send的,不过由一些例外,比如Rc<T>。因为Rc的引用计数的更新不是线程安全的,如果能够在线程间传递Rc会造成预料之外的错误,所在类型系统和trait约束保证了这种用法无法通过编译。
任何完全由Send类型组成的类型也会自动被标记为Send。几乎所有的基本类型都是Send的,除了裸指针。
Sync允许多线程访问
实现了Sync trait的类型可以在多个线程中拥有其值的引用。换种方式来说,如果&T是Send的话,T是Sync。基本类型是Sync的,完全由Sync组成的类型也是Sync的。
Rc也不是Sync的,与其不是Send的原因相同。
手动实现 Send 和 Sync 是不安全的
它们是表示trait,不需要实现任何方法。并且通常由Send和Sync组成的类型,自动就是Send和Sync的。