静态全局 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 章节描述了类型为 SendSync 的含义。它提到:



但这就是问题所在;为什么 *const T 不实现 Sync ?为什么安全 guard 很重要?

就在这之前,它说:



这是原始指针既不是 Send 也不是 Sync 的关键原因。如果您定义了一个封装原始指针的结构,但仅在结构的 API 中将其作为 &T&mut T 公开,您是否真的确保您的结构尊重 SendSync 的约定?如果原始指针是 Send ,那么默认情况下 Rc<T> 也将是 Send ,因此它必须明确选择退出。 (在源代码中,实际上对 Rc<T> 有一个明确的选择退出,但这仅用于文档目的,因为它实际上是多余的。)



好的,让我们回顾一下:它们实现起来是不安全的,但它们是自动派生的。这不是一个奇怪的组合吗?事实上,它并不像听起来那么糟糕。大多数原始类型,如 u32 ,是 SendSync 。简单地将原始值复合到结构体或枚举中不足以取消 SendSync 的类型。因此,在需要编写 Send 之前,您需要一个具有非 Sync 或非 unsafe impl 的结构体或枚举。
SendSync 是标记特征,这意味着它们没有方法。因此,当一个函数或类型将 SendSync 绑定(bind)到一个类型参数上时,它依赖于该类型来遵守其所有 API 中的特定协定。因为这:

关于multithreading - 为什么指向静态不可变变量的不可变指针不是 Sync?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33884184/

10-11 23:02
查看更多