インターネット通販を行っているある商店では、次のC言語のプログラムを用いて売上高の集計を行っている。商品の売り上げがあると関数 calculate
が呼び出され売上高が加算される。複数人の買い物客が同時に買い物を行うと、複数のスレッドが作られ、スレッド切替えを繰り返しながら関数 calculate
が実行されることがある。共用変数 earnings は、売上高、変数 price は売り上げた商品の定価、変数 discount は割引額である。共用変数
earnings への相互排除 (排他制御ともいう) を実現するため、排他ロックを用いることとした。ロック変数 L を獲得する命令 lock(L)
とロックを解放する命令 unlock(L) を挿入する位置として、正しいものを@〜Dの中から選べ。ただし、ロックを獲得している期間は、できるだけ短くなるようにせよ。なお、プログラムの行頭の数字は行番号を表す。
1 int earnings; /* 売上高.スレッド間で共用される */
2
3 void calculate(int price, int discount) {
4 int x;
5 price = price - discount;
6 x = earnings;
7 x = x + price;
8 earnings = x;
9 }
@ lock(L) は4行目と5行目の間、unlock(L) は8行目と9行目の間に挿入する。
A lock(L) は5行目と6行目の間、unlock(L) は8行目と9行目の間に挿入する。
B lock(L) は5行目と6行目の間、unlock(L) は6行目と7行目の間に挿入する。
C lock(L) は7行目と8行目の間、unlock(L) は8行目と9行目の間に挿入する。
D lock(L) は5行目と6行目の間と7行目と8行目の間、unlock(L) は6行目と7行目の間と8行目と9行目の間に挿入する。
A
売上高累計 (earnings) が共用変数であるため、5行目と6行目の間に lock(L) を挿入し、売上高累計を排他制御する。
買い物客一人の売り上げ price を足し込み、売上高累計を確定後、unlock(L) を8行目と9行目の間に挿入し、排他制御を解除する。
W−11 | 目次 | W−13 |