关于&T 是否是 Sync ,文档里的描述有点奇怪。
More examples of basic Sync types include “immutable” types like &T,
and those with simple inherited mutability, such as Box<T>, Vec<T>
and most other collection types.
(Generic parameters need to be Sync for their container to be Sync.)
&T 在 T 是 sync 的情况下是 Sync 。
The following traits are implemented on &T references
if the underlying T also implements that trait:
...
Send (&T references also require T: Sync)
只提到 send ,没有 Sync 。
同时,trait.Send 文档 中有关于 &T 实现 Send 的描述。
impl<T> Send for &T
where
T: Sync + ?Sized,
而 trait.Sync 文档 中,并没有 &T 实现 Sync 的部分。
这是为什么? &mut T 的部分也很奇怪。
1
共 4 条评论, 1 页
评论区
写评论auto deref 自然延伸
若 &T 无条件 Sync, 则 &&T Send 则不同线程可以存在多个 &&T
则 T.method() 会出现并发的可能, 例如: (**&&T).method 因此, 必须要求 T : Sync, 否则 &T 不能跨线程
那为什么文档中有 显式的 impl Send ,没有 impl Sync
--
👇
苦瓜小仔:
&T 在 T 是 sync 的情况下是 Sync 。
这个结论是错的。第一个文档不是那么写的,你再看看
basic Sync types include “immutable” types like &T
这句话,意思是所有&T都属于Sync类,无论T是否属Sync。
既然&T类一律属Sync,第二段就没必要专门提&T属Sync了:
但是如果T属Send并且T属Sync,那么&T也属Send(&T自然而然也属Sync)
原文是:“The precise definition is: a type T is Sync if and only if &T is Send.”
这才是出发点。
这是因为:
&T: Sync
等价于&&T: Send
,其实就是&T: Send
,也就是T: Sync
。&mut T: Sync
等价于&&mut T: Send
,这表示一个独占引用的共享引用可以在线程之间共享,所以很奇怪吗?P.S Alice 有列一个关于 Send 和 Sync 及其组合的总结:https://stackoverflow.com/a/68708557/1704411