Send and Sync 在 libcore 中的作用是什么?

What is the role of Send and Sync in libcore?

SyncSend 在标准库中的 thread API 中扮演了重要角色。但是,它们也包含在 libcore 中。在后者中,有几种实现它们的类型,但我找不到任何 "consumers",也就是说,一些 API 会使用这些特征作为边界。

他们有编译器知道的一些特殊的 behavior/meaning 吗?请注意,它们是 lang 项目,因此它们在某种程度上是特殊的。 Sync好像是related to statics,但是link就不多说了。

TL;DR: 如果 SendSync 是关于线程安全的,它们在 libcore 中扮演什么角色是不是没有多线程的概念?编译器将什么语义分配给它们作为 lang 项?

if Send and Sync are about thread-safety, what role do they fulfill in libcore where there is no notion of multi-threading?

libcore是设置语言的核心概念; SendSync 是语言的核心:编译器知道它们并给出原因1.

libcore 使用 多线程这一事实本身是正交的,与此选择无关。


顺便说一句,请考虑仅仅因为 libcore 没有多线程并不意味着不能在 libcore 之上构建一个具有多线程的替代标准库.那毕竟是把corestd分开的目的。


1 正如@kennytm 在评论中提到的,Rust 有一个用户可访问的机制,允许根据标记特征是否由所有结构字段,或没有。这对于 SendSync 来说有点不够,因为它不支持 &(Trait + Send),因此编译器需要关于这两个的特殊知识,这就是为什么它们是 lang 项。

The compiler will crash if you declare a static variable and no Sync trait exists.

毕竟,仅仅因为我们没有 libstd 的线程实现并不意味着没有并发访问在进行(如果您是裸机,您可能需要担心中断处理程序)。所以,为了安全的静态变量,编译器需要知道静态变量是否可以安全地并发访问。