修改示例 16-15处的不通顺的表述

This commit is contained in:
luoxiangyong 2018-03-01 09:04:07 +08:00 committed by GitHub
parent 786803de42
commit 2b1d11e56e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -245,7 +245,7 @@ counter:std::rc::Rc<std::sync::Mutex<i32>>]`
你可能会好奇为什么不是所有的原始类型都是原子性的?为什么不是所有标准库中的类型都默认使用 `Arc<T>` 实现?原因在于线程安全带有性能惩罚,我们希望只在必要时才为此买单。如果只是在单线程中对值进行操作,原子性提供的保证并无必要,代码可以因此运行的更快。
回到之前的例子:`Arc<T>` 和 `Rc<T>` 有着相同的 API所以修改程序修改 `use` 行和 `new` 调用。示例 16-15 中的代码最终可以编译和运行:
回到之前的例子:`Arc<T>` 和 `Rc<T>` 有着相同的 API所以修改程序中的 `use` 行和 `new` 调用。示例 16-15 中的代码最终可以编译和运行:
<span class="filename">文件名: src/main.rs</span>
@ -291,4 +291,4 @@ Result: 10
另一个值得注意的细节是 Rust 不能避免使用 `Mutex<T>` 的全部逻辑错误。回忆一下第十五章使用 `Rc<T>` 就有造成引用循环的风险,这时两个 `Rc<T>` 值相互引用,造成内存泄露。同理,`Mutex<T>` 也有造成 **死锁***deadlock* 的风险。这发生于当一个操作需要锁住两个资源而两个线程各持一个锁,这会造成它们永远相互等待。如果你对这个主题感兴趣,尝试编写一个带有死锁的 Rust 程序,接着研究任何其他语言中使用互斥器的死锁规避策略并尝试在 Rust 中实现他们。标准库中 `Mutex<T>``MutexGuard` 的 API 文档会提供有用的信息。
接下来,为了丰富本章的内容,让我们讨论一下 `Send``Sync` trait 以及如何对自定义类型使用他们。
接下来,为了丰富本章的内容,让我们讨论一下 `Send``Sync` trait 以及如何对自定义类型使用他们。