首页 > 解决方案 > 使用 Send trait 标记包含 !Send 字段的类型背后的原因是什么?

问题描述

用trait标记包含!Send字段(likeRcNonNull)的类型背后的原因是什么?Send例如,标准库LinkedList以这种方式工作:它包含Option<NonNull<_>>字段并实现Sendtrait(when Tis Send)。

这如何安全,使用这种类型安全工作的保证和方法是什么?

标签: rust

解决方案


看看存在的理由NonNull!Send

NonNull指针不是Send因为它们引用的数据可能有别名。

但是NonNullinLinkedList是一个私有的实现细节。如果此类型知道内部类型TSend并且它的用法也是Send-safe,(在公共 API 中没有不安全性),那么它可以重新引入该Sendtrait。

该保证基本上可以确保您无法获得内部类型的可变别名;并确保没有意外的内部可变性(从不可变的引用获取可变引用)。

这些保证不是由提供的,NonNull而是在LinkedList.


推荐阅读