本文へスキップ

技術士試験(情報工学部門)・情報技術者試験。ファーストマクロ。


Since 2016.4.19

平成22年度 技術士第一次試験問題【専門科目】

W−12

インターネット通販を行っているある商店では、次の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