本文へスキップ

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


Since 2016.4.19

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

W−16

次のプログラムはある銀行口座への入金を行うプログラムである。2人が同時に入金を行うと2つのスレッドが作られ、関数 do_deposit の部分が交互にCPUを使いながら動作する可能性がある。変数 balance は銀行口座の残高、変数 deposit は銀行口座に入金する金額を表す。共用変数 balance への相互排除を実現するためセマフオを用いることとした。セマフォSの初期値、及びプログラム中の  ア  イ  に入る正しい組合せを@〜Dの中から選べ。

int balance; /* 銀行口座の残高.スレッド間で共用される */

void do_deposit (int deposit) {
 int x;
 [  ア  ];
 x = balance;
 x = x + deposit;
 balance = x;
 [  イ  ];
}

   セマフォ S の初期値       

@     1       signal(S)  wait(S)

A     1       wait(S)   signal(S)

B     0       signal(S)  wait(S)

C     0       wait(S)   signal(S)

D   任意の値でよい   signal(S)  wait(S)


正解

A


解説

セマフォは、複数のプロセスが並行して動作し、一つの資源を共有する場合にそのアクセスを制御するための機構のことである。

セマフォの値は「あといくつのプロセスが使えるか」を表す。
wait(S) はP操作ともいい、セマフォの値から1を引き、実行を継続する。
signal(S) は V操作ともいい、セマフォの値に1を足し、待っているタスクが実行可能となる。

従って、セマフォSの初期値を1にして、wait(S) により処理を継続し、balance に値を入力後は signal(S) として、再びセマフォの値を1とする。

W−15 目次 W−17