介绍

本系列录制的视频主要放在B站上Rust死灵书学习视频

Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source

Send和Sync

当同一块内存有多个别名,同时还可以改变内存的值的时候,它们就不是线程安全的。

Rust中根据Send和Sync trait获取相关的信息:

1、如果一个类型可以安全地传递给另一个线程,那么这个类型是实现了Send这个trait了的;
2、如果一个类型可以安全地被多个线程共享,那么这个类型就是Sync的。

Send和Sync是Rust并发机制的基础,但是它们是非安全的trait。Send和Sync是标志trait(即没有任何关联方法),类型要实现它们其实就是满足它们需要的内部特征。不正确的实现Send和Sync会导致未定义行为。

Send和Sync是自动推到的trait,规则:

1、如果一个类型完全由Send或者Sync组成,那么这个类型本身也是Send或者Sync的;
2、几乎所有的基本类型都是Send和Sync的。

例外情况:

1、裸指针不是Send的,也不是Sync的;
2、UnsafeCell不是Sync的(Cell和RefCell也不是);
3、Rc不是Send或Sync的(引用计数是共享且非同步的)。

Rc和UnsafeCell是典型的非线程安全的,因为它们允许非同步地共享可变状态。

不能自动推导的类型也可以很容易的实现Send和Sync:

struct MyBox(*mut u8);unsafe impl Send for MyBox {}
unsafe impl Sync for MyBox {}

还有一个比较少见的场景,一个类型被自动推导为Send或者Sync,但它其实不满足二者的要求,此时我们可以为其去掉Send和Sync的实现,方式如下:

#![feature(negative_impls)]// I have some magic semantics for some synchronization primitive!
struct SpecialThreadToken(u8);impl !Send for SpecialThreadToken {}
impl !Sync for SpecialThreadToken {}

这里需要注意的是,一种类型自己不可能被不正确的推导为Send和Sync,只有类型和其它非安全代码一起实现一些特殊行为时,才可能成为一个不正确的Send或者Sync

024 Rust死灵书之Send和Sync相关推荐

  1. 026 Rust死灵书之实现Vec

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 从 ...

  2. 023 Rust死灵书之并发、竞争

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 并 ...

  3. 016 Rust死灵书之安全方式内存初始化

    本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 介绍 所 ...

  4. 020 Rust死灵书之展开

    本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source Rust ...

  5. 025 Rust死灵书之原子操作

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 原 ...

  6. 019 Rust死灵书之资源管理

    本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 基于所有 ...

  7. 008 Rust死灵书之生命周期

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust相关的源码资料在:https://github.com/anonymousGiga 笔记内容 今天我们跟大家聊一聊生命周期. 命周期 ...

  8. 027 Rust死灵书之Vec内存分配

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source V ...

  9. 035 Rust死灵书之Vec处理零尺寸类型

    介绍 本系列录制的视频主要放在B站上Rust死灵书学习视频 Rust 死灵书相关的源码资料在https://github.com/anonymousGiga/Rustonomicon-Source 详 ...

最新文章

  1. Centos下部署Solr 搜索引擎
  2. java Opencv 图片修复 Photo
  3. module 'torch.jit' has no attribute 'unused'
  4. Markdwon中多张图片的并排显示(Mardown的灵动使用技巧)
  5. SOT-143封装 ESD二极管
  6. FilterDispatcher is deprecated!
  7. 安卓软件错误log_关于android程序的log错误信息的问题,请明白人看下吧,我是初学者,新建的android项目,一个代码都没改过...
  8. 低代码开发平台有哪些?
  9. java生僻字_Android上显示生僻字的方法
  10. EasyUI:form表单提交前验证
  11. HtmlDocument.ExecCommand() 方法
  12. 人工智能导论--基于神经网络的模式识别实验
  13. google之Thumbnails图片等比压缩,保持图片清晰
  14. 智商黑洞(门萨Mensa测试)11
  15. bzoj3208 花神的秒题计划Ⅰ
  16. John Ripper的模式和配置
  17. 网易web安全工程师进阶网易web安全微专业从基础到进阶
  18. 为什么说朋友不多的人才是真正厉害的人呢?
  19. 还没学会微服务?这份最全微服务总结送给你
  20. 计算机科学考研题目,计算机专业考研模拟试题7.docx

热门文章

  1. <<算法很美>>——(三)十大排序算法(下)
  2. Windows10输入法繁体简体切换
  3. matlab如何看线性趋势线,matlab自动画趋势线指标公式
  4. 服务器操作系统巡检维护,服务器操作系统巡检内容
  5. 【慕课网】Web学习笔记———CSS3 (一)
  6. android 仿qq好友动态,Android UI仿QQ好友列表分组悬浮效果
  7. 【Linux】一些命令
  8. 列举3种强制类型转换和2种隐式类型转换?
  9. 练习《learn Python3 the hard way》(Zed Shaw)ex25无法导入模块
  10. 基于 PaddleDetection 的 SoccerNet 多目标跟踪基线