平成22年度 技術士第一次試験問題【専門科目】
【16】情報工学部門
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行目の間、lock(L) は
   6行目と7行目の間と8行目と9行目の間に挿入する。




【正解】 A

売上高累計 (earnings) が共用変数であるため、5行目と6行目の間に
lock(L) を挿入し、売上高累計を排他制御する。
買い物客一人の売り上げ price を足し込み、売上高累計を確定後、
unlock(L) を8行目と9行目の間に挿入し、排他制御を解除する。

EXCELのマクロのご相談なら ファーストマクロ 



W−11 目次 W−13
ファーストマクロ TOPページ