6. Rust 跨线程传递/共享

幻灰龙 2021-06-10 10:08:35

上一条: Mutex/RwLock 下一条:内部共享

对象在跨线程间使用

  1. 一个对象可以从线程A传递给线程B,此时需要对象类型实现  `Send trait`
  2. 一个对象的借用可以从线程A传递给线程B,此时需要对象类型实现  `Sync Trait`
  3. 如果 `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`
...全文
5347 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
flybirding10011 2021-06-18
  • 打赏
  • 举报
回复 1
1

1,725

社区成员

发帖
与我相关
我的任务
社区描述
Rust是新一代大规模底层系统平台开发的强力选项,拥有现代的类型系统,精确的生命周期控制,流畅的表达力和错误处理,以及明晰的异步编程范式。
rust 个人社区
社区管理员
  • 幻灰龙
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
社区主要目的: 1. 讨论Rust的核心语法语义 2. 讨论Rust的编程范式、最佳实践。 3. 讨论10x创新技术

试试用AI创作助手写篇文章吧