Send 与 Sync trait
学习目标
- 理解
Send和Sync的含义 - 掌握自动实现规则
- 理解线程安全边界
核心概念
定义
// Send: 类型的所有权可以在线程间转移
// Sync: 类型可以被多个线程安全地共享引用
// 大部分类型自动实现 Send 和 Sync
// 标记类型(marker traits):没有方法,只有语义
哪些类型实现了什么
| 类型 | Send | Sync | 说明 |
|---|---|---|---|
i32, String | ✅ | ✅ | 基本类型 |
Vec<T> | ✅(如果 T: Send) | ✅(如果 T: Sync) | 集合 |
Rc<T> | ❌ | ❌ | 非原子引用计数 |
Arc<T> | ✅ | ✅ | 原子引用计数 |
Mutex<T> | ✅ | ✅ | 互斥锁 |
Cell<T> | ✅(如果 T: Send) | ❌ | 内部可变性 |
手动实现
use std::rc::Rc;
// Rc 不是 Send,因为引用计数不是原子的
// 所以不能跨线程传递
struct MyType {
data: Rc<i32>, // Rc 使 MyType 不是 Send
}
// 如果需要跨线程,用 Arc 替代 Rc
unsafe 实现
// 慎用!只在确保线程安全时才手动实现
struct MySpecialType {
// ...
}
// unsafe impl Send for MySpecialType {}
// unsafe impl Sync for MySpecialType {}
小结
| Trait | 含义 |
|---|---|
Send | 所有权可跨线程转移 |
Sync | 引用可跨线程共享 |
| 自动实现 | 大部分类型自动满足 |
Rc | 不是 Send/Sync |
Arc | 是 Send/Sync |