Sync
和Send
在标准库的thread
API中扮演重要角色。但是,它们也包含在libcore
中。在后者中,有一些类型可以实现它们,但是我找不到任何"消费者",也就是说,某些API会将这些特征用作边界。
他们是否有一些编译器知道的特殊行为/含义?请注意,它们是lang项目,所以它们在某种程度上是特殊的。 Sync
似乎是related to statics,但链接没有详细说明。
TL; DR:,如果Send
和Sync
是关于线程安全的,那么它们在libcore
中在没有多重概念的情况下会发挥什么作用-threading?编译器为lang项分配了什么语义?
答案 0 :(得分:6)
如果
Send
和Sync
是关于线程安全的,那么它们在没有多线程概念的libcore
中会扮演什么角色?
libcore
是关于设定语言的核心概念; Send
和Sync
是该语言的核心:编译器知道并了解它们 1 。
libcore
不使用多线程本身的事实是正交的,并且不会对此选择产生影响。
顺便说一句,请考虑这只是因为libcore
没有多线程并不意味着无法在具有多线程的libcore
之上构建替代标准库。毕竟,这是将core
与std
分开的目的。
1 正如@kennytm在评论中所提到的,Rust有一个用户可访问的机制,允许根据所有特征是否由所有结构字段实现来自动传播标记特征。但是,Send
和Sync
略有不足,因为它不支持&(Trait + Send)
,因此编译器需要有关这两者的特殊知识,这就是为什么它们是lang项目。< / em>的
答案 1 :(得分:1)
The compiler will crash if you declare a static
variable and no Sync
trait exists
毕竟,仅仅因为我们没有libstd在线程中实现线程并不意味着没有并发访问(如果你是裸机) ,你可能有中断处理程序担心)。因此,为了使静态变量安全,编译器需要知道是否可以同时安全地访问静态变量。