排他制御を使用しない場合
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/02/12 13:56 UTC 版)
「クリティカルセクション」の記事における「排他制御を使用しない場合」の解説
ここで、現在ディスクに書き込まれているカウンタの値が100だったとする。 ユーザーAがこのウェブページを訪れ、カウンタプログラムのスレッドAが実行され始めたとしよう。スレッドAは処理1でカウンタの値を読み出し(値は100)、処理2で値を増やす(値は101)。次に処理3で値を書き戻すのだが、ここでユーザーBがウェブページを訪れたことにより別のスレッドBが実行され、すぐさまコンテキストスイッチが起きて処理がスレッドBに移されたとする。スレッドBがカウンタの値を読み出すと値は100になる。なぜならば、スレッドAがまだ処理3を完了していないため、ディスク上の値は変化していないからである。そして、スレッドBは値を増やし、その結果の101という値をディスクに書き込み、スレッドを終了する。次に再びスレッドAに処理が移り、スレッドAは処理3を行ない、ディスクには101という値が書き込まれて、スレッドAも処理を終える。 結果として、ユーザーAとユーザーBの2人がページを訪れたので、本来カウンタの値は2増えて102にならなければならないのに、最終的にディスクに書き込まれた値は101となり、破綻をきたす。 以上の処理を時間に沿ってまとめたものが以下の表である。 ディスク上の値スレッドA(値)スレッドB(値)100 スレッド発生 100 処理1(100) 100 処理2(101) 100 待機 スレッド発生 100 処理1(100) 100 処理2(101) 101 処理3(101) 101 スレッド終了 101 処理3(101) 101 スレッド終了
※この「排他制御を使用しない場合」の解説は、「クリティカルセクション」の解説の一部です。
「排他制御を使用しない場合」を含む「クリティカルセクション」の記事については、「クリティカルセクション」の概要を参照ください。
- 排他制御を使用しない場合のページへのリンク