-
通道的发送端有一个
send
方法用来获取需要放入通道的值。send 方法返回一个Result<T, E>
类型,所以如果接收端已经被丢弃了,将没有发送值的目标,所以发送操作会返回错误。在这个例子中,出错的时候调用 unwrap 产生 panic -
recv,它是
receive
的缩写。这个方法会阻塞主线程
执行直到从通道中接收一个值。一旦发送了一个值,recv 会在一个 Result<T, E> 中返回它。当通道发送端关闭,recv 会返回一个错误表明不会再有新的值到来了
try_recv
不会阻塞,相反它立刻返回一个 Result<T, E>:Ok 值包含可用的信息,而 Err 值代表此时没有任何消息
- send 函数获取其参数的所有权并移动这个值归接收者所有。这个意味着不可能意外的在发送后再次使用这个值;所有权系统检查一切是否合乎规则
which does not implement the Copy
trait 跨线程访问
使用 Arc 包装一个 Mutex 能够实现在多线程之间共享所有权
这意味着 Mutex 提供了内部可变性,就像 Cell 系列类型那样。正如第十五章中使用 RefCell 可以改变 Rc 中的内容那样,同样的可以使用 Mutex 来改变 Arc 中的内容。
std::marker 中的 Sync 和 Send trait。
Send 标记 trait 表明类型的所有权可以在线程间传递。几乎所有的 Rust 类型都是Send 的,不过有一些例外,包括 Rc:这是不能 Send 的
Sync 标记 trait 表明一个实现了 S