データ D を更新する二つの処理 A,B が,①→③→②→④ のタイミングで実行された場合,D の値は幾らになるか。ここで,D の初期値は 2 とする。
| 処理A 〔処理内容〕 | 処理B 〔処理内容〕 |
|---|---|
| ① D を読み込み,3倍する。 | ③ D を読み込み,5を加える。 |
| ② ①の結果を,D に書き込む。 | ④ ③の結果を,D に書き込む。 |
这道题的解析和你的作答记录。
データ D を更新する二つの処理 A,B が,①→③→②→④ のタイミングで実行された場合,D の値は幾らになるか。ここで,D の初期値は 2 とする。
| 処理A 〔処理内容〕 | 処理B 〔処理内容〕 |
|---|---|
| ① D を読み込み,3倍する。 | ③ D を読み込み,5を加える。 |
| ② ①の結果を,D に書き込む。 | ④ ③の結果を,D に書き込む。 |
6 是在 ② 中把 ① 的计算结果(2×3)写入之后的值,但随后 ④ 中处理B 会用 7 覆盖它,所以它不会作为最终值留下来。要让 6 成为答案,顺序必须是 ①→③→④→②,也就是处理B 先写入、处理A 后写入的情况,这与本题的 ①→③→②→④ 顺序不同。
正解 正确答案是 イ(7)。把读取(取值)和写入(更新)分开,按 ①→③→②→④ 的顺序追踪 D 的值以及各处理手中保存的计算结果。初始值为 D=2。① 处理A 读取 D,算出 2×3=6,但此时还没有写入,所以 D 仍然是 2。③ 处理B 读取 D。由于 ② 的写入尚未完成,处理B 读到的是旧值 2,于是算出 2+5=7。② 处理A 把 ① 的结果 6 写入 D,D 变为 6。④ 处理B 把 ③ 的结果 7 写入 D,覆盖掉 D=6,D 变为 7。最后写入的处理B 的值留了下来,所以答案是 7。这里处理A 的更新(6)被处理B 覆盖而消失,这就是没有做互斥控制时发生的「更新丢失(lost update)」。
11 是处理A 完全结束之后处理B 才读取的情况,也就是按 ①→②→③→④ 的顺序串行执行时的值((2×3)+5=11)。本题中 ③ 先于 ② 执行,所以处理B 读到的不是更新后的 6,而是初始值 2,得不到 11。不要把它与互斥控制正常发挥作用时的理想结果混为一谈。
21 是处理B 先完成之后处理A 才读取的情况,也就是按 ③→④→①→② 的顺序串行执行时的值((2+5)×3=21)。本题中 ① 排在最前面,所以处理A 读到的是 2,不会出现把 7 乘以 3 的场面。