新线程的启动时间点和结束时间点是不确定的
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 中绝大多数类型都实现了Send和Sync,除了以下几个
- 裸指针两者都没实现,因为它本身就没有任何安全保证
UnsafeCell不是Sync,因此Cell和RefCell也不是Rc两者都没实现(因为内部的引用计数器不是线程安全的)
Send和Sync是unsafe特征,实现时需要用unsafe代码块包裹。