静态全局 C 字符串(如在 this answer 中)没有 Sync
trait 。
pub static MY_STRING: &'static *const u8
= "hello" as const *u8;
// TODO: Simple assertion showing it's not Sync ;)
Sync
被描述为看起来这完全是只读的并且具有静态生命周期,那么为什么传递引用不安全呢?
最佳答案
Send and Sync 中的 The Rustonomicon 章节描述了类型为 Send
或 Sync
的含义。它提到:
但这就是问题所在;为什么 *const T
不实现 Sync
?为什么安全 guard 很重要?
就在这之前,它说:
这是原始指针既不是 Send
也不是 Sync
的关键原因。如果您定义了一个封装原始指针的结构,但仅在结构的 API 中将其作为 &T
或 &mut T
公开,您是否真的确保您的结构尊重 Send
和 Sync
的约定?如果原始指针是 Send
,那么默认情况下 Rc<T>
也将是 Send
,因此它必须明确选择退出。 (在源代码中,实际上对 Rc<T>
有一个明确的选择退出,但这仅用于文档目的,因为它实际上是多余的。)
好的,让我们回顾一下:它们实现起来是不安全的,但它们是自动派生的。这不是一个奇怪的组合吗?事实上,它并不像听起来那么糟糕。大多数原始类型,如 u32
,是 Send
和 Sync
。简单地将原始值复合到结构体或枚举中不足以取消 Send
或 Sync
的类型。因此,在需要编写 Send
之前,您需要一个具有非 Sync
或非 unsafe impl
的结构体或枚举。Send
和 Sync
是标记特征,这意味着它们没有方法。因此,当一个函数或类型将 Send
或 Sync
绑定(bind)到一个类型参数上时,它依赖于该类型来遵守其所有 API 中的特定协定。因为这:
关于multithreading - 为什么指向静态不可变变量的不可变指针不是 Sync?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33884184/