< 返回版块

leolee0101 发表于 2023-03-03 15:36

关于&T 是否是 Sync ,文档里的描述有点奇怪。

trait.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 。

但在 primitive.reference 文档

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 的部分也很奇怪。

评论区

写评论
zylthinking 2023-05-18 14:14

auto deref 自然延伸

若 &T 无条件 Sync, 则 &&T Send 则不同线程可以存在多个 &&T

则 T.method() 会出现并发的可能, 例如: (**&&T).method 因此, 必须要求 T : Sync, 否则 &T 不能跨线程

作者 leolee0101 2023-03-03 16:31

那为什么文档中有 显式的 impl Send ,没有 impl Sync

--
👇
苦瓜小仔:

hax10 2023-03-03 16:19

&T 在 T 是 sync 的情况下是 Sync 。

这个结论是错的。第一个文档不是那么写的,你再看看

basic Sync types include “immutable” types like &T

这句话,意思是所有&T都属于Sync类,无论T是否属Sync。

既然&T类一律属Sync,第二段就没必要专门提&T属Sync了:

if the underlying T also implements that trait:
...
Send (&T references also require T: Sync)

但是如果T属Send并且T属Sync,那么&T也属Send(&T自然而然也属Sync)

苦瓜小仔 2023-03-03 16:12

原文是:“The precise definition is: a type T is Sync if and only if &T is Send.”

精确的定义:当且仅当 &T: Send 时, 才有 T: Sync

这才是出发点。


&T 在 T 是 sync 的情况下是 Sync 。

这是因为:

  • &T: Sync 等价于 &&T: Send,其实就是 &T: Send,也就是 T: Sync

&mut T 的部分也很奇怪。

&mut T: Sync 等价于 &&mut T: Send,这表示一个独占引用的共享引用可以在线程之间共享,所以很奇怪吗?


P.S Alice 有列一个关于 Send 和 Sync 及其组合的总结:https://stackoverflow.com/a/68708557/1704411

1 共 4 条评论, 1 页