新线程的启动时间点和结束时间点是不确定的

mpsc::channel() 是异步通道,相当于不限缓冲大小的mpsc::sync_channel()

发送之后的输出是在receive 1之后,说明x只有接收消息彻底成功后,发送消息才算完成。 #? 跟go的channel一样吗?

CPU在访问内存时顺序

  • 代码中的先后顺序
  • 编译优化导致指令重排
  • 运行阶段因CPU缓存导致顺序被打乱 ref
unsafe impl<T: ?Sized + Send> Send for Mutex<T> {}
unsafe impl<T: ?Sized + Send> Sync for Mutex<T> {}

T只支持线程安全移动,不支持线程安全共享;用Mutex<>包装后,Mutex<T>增加了线程安全共享功能;再用Arc<>包装后,Arc<Mutex<T>>增加了共享所有权功能。

Rust 中绝大多数类型都实现了SendSync,除了以下几个

  • 裸指针两者都没实现,因为它本身就没有任何安全保证
  • UnsafeCell不是Sync,因此CellRefCell也不是
  • Rc两者都没实现(因为内部的引用计数器不是线程安全的)

SendSyncunsafe特征,实现时需要用unsafe代码块包裹。

参考