上一条: Mutex/RwLock 下一条:内部共享
对象在跨线程间使用
- 一个对象可以从线程A传递给线程B,此时需要对象类型实现 `Send trait`
- 一个对象的借用可以从线程A传递给线程B,此时需要对象类型实现 `Sync Trait`
- 如果 `T` 实现了 `Sync`,则 `& T` 自动实现了`Send` => `& T` 可以从线程A传递给线程B
根据上面的规则【1】,实际上一个对象从线程A传递给线程B有如下情况
- 原生指针即不实现 `Send`, 也不实现 `Sync`
- Copy,既然都Copy了,每个线程持有一份独立拷贝
- Move,既然Move了,每次只有一个线程有所有权,
- 唯一所有权对象的Borrow
- 不可变借用,多个线程间不可变借用,同时读取,遵循可同时多处不可变借用规则
- 可变借用,一次只能有一个线程持有可变借用,唯一写
- 多所有权对象的Borrow
- `Rc` 即不实现 `Send` 也不实现 `Sync`,这是因为 `Rc` 的引用计数并没有使用Lock或者 Aotomic ,因此不能在多个线程间同时修改引用计数,不能在线程间 Send,更不能 Sync 了
- `Arc` 实现了线程安全的引用计数,实现了`Send`,如果内部包含的类型可以`Sync`,则`Arc<T>` 也能 `Sync`
- `UnsafeCell` 没有实现`Sync`,因此 `Cell` 和 `RefCell` 也没有实现 `Sync`,但是可以`Send`