并发

std::marker::Send 允许跨线程转移所有权

Send 标记特性用于标识实现该特性的类型的所有权可以在线程中间转移,几乎所有 Rust 类型都实现了 Send ,但是也有一些例外如:

  • Rc<T> ,如果克隆后在多个线程中转移所有权可能会多个线程同时增加计数器,可以使用 Arc<T> 替代

如果一个新的类型组合的类型都实现了 Send 那么该类型也自动实现了 Send ,几乎所有原始类型都实现了 Send .

std::marker::Sync 允许多个线程同时访问

Sync 标记特性用于标识实现该特性的类型可以在多个线程中引用,任何类型 TSync 并且 T 的引用 &TSend 则意味着引用可以安全的发送给其他线程。

Send 类似,几乎所有原始类型都实现了 Sync ,组合了所有类型都是 Sync 的类型自动实现 Sync

以下只能指针没有实现 Sync

  • Rc<T> 同样没有实现 Sync
  • RcCell<T>Cell<T>

自己实现 SyncSend 是不安全的