応用情報技術者カーネルとスレッドの並行制御オリジナル・公式資料照合難易度★★★★☆
POSIXスレッドを使うプログラムで、複数のワーカーが共有キューから要素を取り出す。キューの操作と空判定は同じmutexで保護し、追加側は条件変数へ通知する。pthread_cond_waitはmutexを解放して待ち、戻る前に再取得する。待機側の適切な処理はどれか。
A
mutex保持中、whileでキューが空の間pthread_cond_waitを繰り返し、空でなくなってから要素を取り出す★ 正解
通知後に別ワーカーが先に要素を消費した場合やspurious wakeupに備え、mutex下で待つ条件を再評価します。
B
条件変数から一度戻れば必ず要素があるので、キューを再確認しない
待機からの復帰は条件が真であることの保証ではありません。他のワーカーの消費や見かけ上の起床も考慮します。
C
空判定の後でmutexを解放し、条件を保護せずに待機する
判定と待機の間の競合で通知を取り逃す原因になります。指定mutexと条件変数の原子的な解放・待機を利用します。
D
pthread_cond_signalの回数が未消費の要素数として常に蓄積されるとみなし、待機側の空判定を省く
条件変数の通知は要素数を蓄積するカウンターではありません。共有キューの状態をmutex下で再評価する必要があります。
解説
条件変数は「条件が真になった」という恒久的な保証を渡すものではありません。待ちたい条件をmutexで保護し、whileによる再確認とpthread_cond_waitの解放・待機・再取得を組み合わせます。
根拠資料・確認情報
対応範囲:2026年度 応用情報技術者試験
資料確認日:2026-10-28
同じレッスンの問題
問題 1
Linuxカーネルの共有atomic_tカウンターは0で始まる。2スレッドがそれぞれ1,000回、次の処理を行う。処理完了後にカウンターを読む。整数の範囲超過や他の更新はない。常に2,000にする修正はどれか。
v = atomic_read(&counter);
atomic_set(&counter, v + 1);
この2行の間には他スレッドの処理が入り得る。
問題 2
LinuxのSMPカーネルで、CPU Aがデータを作ってCPU Bへ一度だけ公開する。dataとreadyは0で初期化済み、readyは整列した整数でAだけが0から1へ一度変更し、公開後dataは変更しない。Bはready=1を観測した後にdataを読む。弱いメモリ順序のCPUも対象に、data=42を公開する組合せはどれか。
A: WRITE_ONCE(data, 42); 【公開操作】
B: 【確認操作】でready=1を確認後、READ_ONCE(data);
問題 3
PREEMPT_RTを使わないLinuxカーネルのプロセスコンテキストで、spinlock_tを保持したまま、睡眠して待つ可能性のある処理を呼んでいる。この共有状態を使うのはプロセスコンテキストだけで、hard IRQ等からの利用はない。設計の見直しとして適切なのはどれか。
問題 4
PREEMPT_RTを使わないLinuxのSMPカーネルで、同じspinlock_tをプロセスコンテキストとhard IRQハンドラーが使用する。プロセスがローカルIRQを有効にしたままspin_lockで取得すると、そのCPUで割込みが起き、ハンドラーも同じロックを待つ場合がある。適切な対策はどれか。クリティカルセクション内で睡眠はしない。