二つのスレッドが共有変数countを1ずつ増やす。各スレッドは「countを読む」「読み取った値に1を足す」「countへ書く」の3段階を実行し、3段階全体は不可分ではない。更新の取りこぼしを防ぐ方法として適切なものはどれか。
本サイトで独自に作成。IPAの試験問題からの転載ではありません。
公開日:
選択肢を選んで、答え合わせをしましょう。
回答せずに正解・解説を確認する
正解:ウ 読込みから書込みまで全体を、同じロックで排他制御する
この表示だけでは、回答数や正答率は変わりません。
解説
同じ初期値を二つのスレッドが読み、両方が同じ更新値を書き込むと、2増えるはずのcountが1しか増えないことがあります。共有値の読込み、加算、書込み全体を共通のロックで保護すれば、一方が更新を終えてから他方が最新値を読めます。
読込み後にロックを外すと、二つのスレッドが同じ値を基に計算する可能性が残ります。
書込み同士を直列にしても、どちらも古い値から計算していたら更新を失います。
共有値に対する一連の操作を一つのクリティカルセクションとして保護します。
互いに別のロックでは同時実行を防げません。同じ共有資源を共通のロックで守る必要があります。
関連知識
適切な原子的加算命令も対策になります。この問題は3段階が不可分でないと明記しています。ロックを使う場合は例外時にも解放することや、複数ロックの順序にも注意します。
間違えやすいポイント
書込みだけを守ればよいと思わず、書き込む値を決める読込みも同じ保護範囲へ入れます。
覚え方
共有値の「読んで、変えて、書く」をまとめて守る。
実務での意味
在庫数やアクセス回数などを複数の処理から同時に更新するとき、更新単位を明確にします。
解説:本サイト編集部によるオリジナル文章