【发布时间】:2017-01-25 07:55:05
【问题描述】:
我搜索了Sync 的类型,但不是Send,因为它通常看起来一个特征是另一个特征的超集(“实现Sync 的每个类型也实现Send” )。我找到了this question,但唯一真正的答案非常复杂。
所以我想出了这个代码:
struct Foo(Rc<()>); // <-- private field
impl Foo {
fn my_clone(&mut self) -> Self { // <-- mutable borrow
Foo(self.0.clone())
}
}
我知道编译器不会为我的类型自动实现Send 或Sync;但我对我可以安全地手动实现的东西感兴趣。我认为:
它应该能够实现
Sync:拥有对Foo的不可变引用不会让我们对它做任何事情(因为我们只能通过可变/独占引用调用my_clone())。而且不做任何事情,什么都不会出错,对吧?应该不能够实现
Send:我们可以在主线程中(在启动另一个线程之前)克隆我们的Foo以获得第二个对象。现在两个对象共享一些内存(引用计数,存储在Cell<usize>中)。如果我现在可以将其中一个对象发送到另一个线程,那么两个线程都将拥有Foo的所有权,引用相同的内存。因此,两个对象可以同时调用my_clone(),从而导致对引用计数的同时、非同步、可变访问(数据竞争)。
这个推理是正确的还是我遗漏了什么?
【问题讨论】:
标签: multithreading rust