File tree Expand file tree Collapse file tree 2 files changed +731
-11
lines changed Expand file tree Collapse file tree 2 files changed +731
-11
lines changed Original file line number Diff line number Diff line change @@ -278,35 +278,35 @@ fn main() {
278
278
279
279
<p >想象一下,两个线程都将一个 7 release-store 到相同的原子变量中,第三个线程从该变量中加载 7。第三个线程和第一个或者第二个线程有一个 happens-before 关系吗?这取决于它加载“哪个 7”:线程一还是线程二的。(或许一个不相关的 7)。这使我们得出的结论是,尽管 7 等于 7,但两个 7 与两个线程有一些不同。</p >
280
280
281
- <p >思考这个问题的方式是我们在[“Relaxed 排序”]( #relaxed-排序) 中讨论的*总修改顺序*:发生在原子变量上的所有修改的有序列表。即使将相同的值多次写入相同的变量,这些操作中的每一个都以该变量的总修改顺序代表一个单独的事件。当我们加载一个值,加载的值与每个变量“时间线”上的特定点相匹配,这告诉我们我们可能会同步哪个操作。</p >
281
+ <p >思考这个问题的方式是我们在< a href = " #relaxed-排序 " >“Relaxed 排序”</ a > 中讨论的*总修改顺序*:发生在原子变量上的所有修改的有序列表。即使将相同的值多次写入相同的变量,这些操作中的每一个都以该变量的总修改顺序代表一个单独的事件。当我们加载一个值,加载的值与每个变量“时间线”上的特定点相匹配,这告诉我们我们可能会同步哪个操作。</p >
282
282
283
283
<p >例如,如果原子总修改顺序是</p >
284
284
285
- 1 . 初始化为 0
285
+ < p > 1. 初始化为 0</ p >
286
286
287
- 2 . Release-store 7(来自线程二)
287
+ < p > 2. Release-store 7(来自线程二)</ p >
288
288
289
- 3 . Release-store 6
289
+ < p > 3. Release-store 6</ p >
290
290
291
- 4 . Release-store 7(来自线程一)
291
+ < p > 4. Release-store 7(来自线程一)</ p >
292
292
293
293
<p >然后,acquire-load 7 将与第二个线程的 release-store 或者最后一个事件的 release-store 同步。然而,如果我们之前(就 happens-before 关系而言)见过 6,我们知道我们看到的是最后一个 7,而不是第一个 7,这意味着我们现在与线程一有 happens-before 的关系,而不是线程二。</p >
294
294
295
295
<p >还有一个额外的细节,即 release-stored 的值可能会被任意数量的「获取并修改」和「比较并交换」操作修改,但仍会导致与 acquire-load 读取最终结果的 happens-before 关系。</p >
296
296
297
297
<p >例如,想象一个具有以下总修改顺序的原子变量:</p >
298
298
299
- 1 . 初始化为 0
299
+ < p > 1. 初始化为 0</ p >
300
300
301
- 2 . Release-store 7
301
+ < p > 2. Release-store 7</ p >
302
302
303
- 3 . Relaxed-fetch-and-add 1,改变 7 到 8
303
+ < p > 3. Relaxed-fetch-and-add 1,改变 7 到 8</ p >
304
304
305
- 4 . Relaxed-fetch-and-add 1,改变 8 到 9
305
+ < p > 4. Relaxed-fetch-and-add 1,改变 8 到 9</ p >
306
306
307
- 5 . Release-store 7
307
+ < p > 5. Release-store 7</ p >
308
308
309
- 6 . Relaxed-swap 10,改变 7 到 10
309
+ < p > 6. Relaxed-swap 10,改变 7 到 10</ p >
310
310
311
311
<p >现在,如果我们在这个变量上执行 acquire-load 到 9,我们不仅与第四个操作(存储此值)建立了一个 happens-before 关系,同时也与第二个操作(存储 7)建立了该关系,即使第三个操作使用了 Relaxed 内存排序。</p >
312
312
You can’t perform that action at this time.
0 commit comments