作者:zc43pml | 来源:互联网 | 2023-09-08 14:39
在Jim Blandy、Jason Orendorff、Leonora FS Tindall 的“Programming Rust,第 2 版”中,
第 520 页有一个图表显示了发送和同步,其中重叠圆圈中的同步完全包含在发送中。
这让我相信所有实现同步的东西也必须实现发送,但是这个来自第 561 页的例子和我看到的所有东西总是分别指定它们,
type GenericError = Box
为什么如果实现 Sync 的东西 100% 也是 Send,那么 Sync 不是 Send 的子特性吗?为什么 trait bound 需要同时指定两者?为什么人们都标记两者。有什么用例可以同步而不是发送吗?在什么情况下,您可以与另一个线程共享可变引用,但不能将所有权授予该另一个线程吗?
回答
这本书似乎是错误的。之间的唯一关系Send
,并Sync
是T
是Sync
当且仅当&T
是Send
(这是有道理的,因为“同步”跨线程其实只是能够在线程之间共享对它的引用)。事实上,标准库中甚至还有一种类型,Sync
但不是Send
: MutexGuard
。原因是当尝试从锁定互斥锁的线程以外的线程解锁互斥锁时,底层实现会导致未定义的行为。