Synctrait是Sendtrait的严格子集吗?什么实现同步而不发送?

在Jim Blandy、Jason Orendorff、Leonora FS Tindall 的“Programming Rust,第 2 版”中
第 520 页有一个图表显示了发送和同步,其中重叠圆圈中的同步完全包含在发送中。

这让我相信所有实现同步的东西也必须实现发送,但是这个来自第 561 页的例子和我看到的所有东西总是分别指定它们,

type GenericError = Box<dyn std::error::Error + Send + Sync + 'static>

为什么如果实现 Sync 的东西 100% 也是 Send,那么 Sync 不是 Send 的子特性吗?为什么 trait bound 需要同时指定两者?为什么人们都标记两者。有什么用例可以同步而不是发送吗?在什么情况下,您可以与另一个线程共享可变引用,但不能将所有权授予该另一个线程吗?

回答

这本书似乎是错误的。之间的唯一关系Send,并SyncTSync当且仅当&TSend(这是有道理的,因为“同步”跨线程其实只是能够在线程之间共享对它的引用)。事实上,标准库中甚至还有一种类型,Sync但不是Send: MutexGuard。原因是当尝试从锁定互斥锁的线程以外的线程解锁互斥锁时,底层实现会导致未定义的行为。


以上是Synctrait是Sendtrait的严格子集吗?什么实现同步而不发送?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>