
基本情報技術者試験基礎・応用
条件を読む・根拠を説明する
加算命令を分割すると起こること
条件を整理し、答えを選んでから解き方を確認しましょう。
共有x=10。二つのスレッドがそれぞれread(x)、local+1、write(x)を実行する。どちらも10を読んでから順に11を書いた。結果と対策はどれか。
答え・解き方を読む
11となり更新が一つ失われるため一連の処理を排他化する
図で見る
同じ旧値を読んだ更新が上書きされる
同じ旧値を読んだ二処理が各自の計算結果を書き、後の書込みが先の更新を失わせます。ロック・原子的更新など、問題に対応した排他方法を検討します。
図は問題の関係を整理する模式図です。記号には各問題の数値を当てはめます。寸法・面積・時間の縮尺や、実施工の全条件は表していません。
考える順序
- 1両スレッドは同じ10から11を計算
- 2後の11の書込みは先の増加を反映しない
- 3読取りから更新までを一つの保護区間等にする
選択肢ごとの理由
- 比較 · readだけ排他化すればその後の同時加算は必ず安全
読取り後の更新まで分離されると同じ競合が残ります。
- 正解 · 11となり更新が一つ失われるため一連の処理を排他化する
両スレッドは同じ10から11を計算。後の11の書込みは先の増加を反映しない。読取りから更新までを一つの保護区間等にする。
- 比較 · 12となるので排他は不要
二つとも古い値を基にするので12にはなりません。
- 比較 · 11は正しい二回の加算結果なので対策不要
二回加算した業務上の結果は12であり更新が失われています。