Skip to content

Commit f4dbf67

Browse files
fwqaaqAoanghycinth22
authored
translation: Chapter 5 initialization (#29)
* translation: Chapter 5 initialization * Simple Mutex-Based Channel and Unsafe Channel * Fix typo: Chapter 1 (#30) * Fix typo and retranslate some sentences Fix typo and retranslate some sentences * fix typo * Update 1_Basic_of_Rust_Concurrency.md --------- Co-authored-by: fwqaaq <fwqaaq@gmail.com> * Safety Through Runtime Checks * Safety Through Types * fix typo 1_Basic_of_Rust_Concurrency.md (#32) * fix typo 1_Basic_of_Rust_Concurrency.md * fix typos * Blocking --------- Co-authored-by: Aoang <aoang@x2oe.com> Co-authored-by: 听寒 <10476912+hycinth22@users.noreply.github.com>
1 parent d948e5e commit f4dbf67

File tree

2 files changed

+731
-11
lines changed

2 files changed

+731
-11
lines changed

3_Memory_Ordering.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -278,35 +278,35 @@ fn main() {
278278

279279
<p>想象一下,两个线程都将一个 7 release-store 到相同的原子变量中,第三个线程从该变量中加载 7。第三个线程和第一个或者第二个线程有一个 happens-before 关系吗?这取决于它加载“哪个 7”:线程一还是线程二的。(或许一个不相关的 7)。这使我们得出的结论是,尽管 7 等于 7,但两个 7 与两个线程有一些不同。</p>
280280

281-
<p>思考这个问题的方式是我们在[“Relaxed 排序”](#relaxed-排序)中讨论的*总修改顺序*:发生在原子变量上的所有修改的有序列表。即使将相同的值多次写入相同的变量,这些操作中的每一个都以该变量的总修改顺序代表一个单独的事件。当我们加载一个值,加载的值与每个变量“时间线”上的特定点相匹配,这告诉我们我们可能会同步哪个操作。</p>
281+
<p>思考这个问题的方式是我们在<a href="#relaxed-排序">“Relaxed 排序”</a>中讨论的*总修改顺序*:发生在原子变量上的所有修改的有序列表。即使将相同的值多次写入相同的变量,这些操作中的每一个都以该变量的总修改顺序代表一个单独的事件。当我们加载一个值,加载的值与每个变量“时间线”上的特定点相匹配,这告诉我们我们可能会同步哪个操作。</p>
282282

283283
<p>例如,如果原子总修改顺序是</p>
284284

285-
1. 初始化为 0
285+
<p>1. 初始化为 0</p>
286286

287-
2. Release-store 7(来自线程二)
287+
<p>2. Release-store 7(来自线程二)</p>
288288

289-
3. Release-store 6
289+
<p>3. Release-store 6</p>
290290

291-
4. Release-store 7(来自线程一)
291+
<p>4. Release-store 7(来自线程一)</p>
292292

293293
<p>然后,acquire-load 7 将与第二个线程的 release-store 或者最后一个事件的 release-store 同步。然而,如果我们之前(就 happens-before 关系而言)见过 6,我们知道我们看到的是最后一个 7,而不是第一个 7,这意味着我们现在与线程一有 happens-before 的关系,而不是线程二。</p>
294294

295295
<p>还有一个额外的细节,即 release-stored 的值可能会被任意数量的「获取并修改」和「比较并交换」操作修改,但仍会导致与 acquire-load 读取最终结果的 happens-before 关系。</p>
296296

297297
<p>例如,想象一个具有以下总修改顺序的原子变量:</p>
298298

299-
1. 初始化为 0
299+
<p>1. 初始化为 0</p>
300300

301-
2. Release-store 7
301+
<p>2. Release-store 7</p>
302302

303-
3. Relaxed-fetch-and-add 1,改变 7 到 8
303+
<p>3. Relaxed-fetch-and-add 1,改变 7 到 8</p>
304304

305-
4. Relaxed-fetch-and-add 1,改变 8 到 9
305+
<p>4. Relaxed-fetch-and-add 1,改变 8 到 9</p>
306306

307-
5. Release-store 7
307+
<p>5. Release-store 7</p>
308308

309-
6. Relaxed-swap 10,改变 7 到 10
309+
<p>6. Relaxed-swap 10,改变 7 到 10</p>
310310

311311
<p>现在,如果我们在这个变量上执行 acquire-load 到 9,我们不仅与第四个操作(存储此值)建立了一个 happens-before 关系,同时也与第二个操作(存储 7)建立了该关系,即使第三个操作使用了 Relaxed 内存排序。</p>
312312

0 commit comments

Comments
 (0)