応用情報技術者カーネルとスレッドの並行制御オリジナル・公式資料照合難易度★★★★☆

Linuxカーネルの共有atomic_tカウンターは0で始まる。2スレッドがそれぞれ1,000回、次の処理を行う。処理完了後にカウンターを読む。整数の範囲超過や他の更新はない。常に2,000にする修正はどれか。 v = atomic_read(&counter); atomic_set(&counter, v + 1); この2行の間には他スレッドの処理が入り得る。

A
atomic_readとatomic_setは個別に不可分なので、修正なしで常に2,000になる

個々の読取り・書込みが不可分でも、2スレッドが同じ値を読んで同じ次の値を書く更新消失は起こり得ます。

B
読み出しと書込みの間にコンパイラ用barrier()だけを入れる

コンパイラの並べ替えを制限しても、複数操作の間へ他CPUが入ることは防げません。

C
2行を、不可分のread-modify-writeであるatomic_inc(&counter)へ置き換える★ 正解

atomic_incは値の読取り・加算・書込みを一つの不可分な更新として行うため、条件下では計2,000回を反映できます。

D
カウンターをvolatileとして扱うだけで、同じ2行を残す

volatileは読み・加算・書込み全体を一つのCPU間RMWにする機能ではありません。更新消失の可能性は残ります。

解説

atomic_tの読取りと設定を組み合わせただけでは、全体の加算は不可分になりません。純粋な個数の加算にはatomicなRMWを使います。関連データの公開順序が必要なら、それは別に設計します。

根拠資料・確認情報

対応範囲:2026年度 応用情報技術者試験

資料確認日:2026-10-28

同じレッスンの問題

問題 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で割込みが起き、ハンドラーも同じロックを待つ場合がある。適切な対策はどれか。クリティカルセクション内で睡眠はしない。
問題 5
単一CPUのプリエンプティブな固定優先度スケジューリングで、低優先度Lがmutexを保持し、高優先度Hがそのmutexを待っている。中優先度MがCPUを使い続け、Lが解放まで進めない。mutexが優先度継承をサポートし、Lの保護区間は有限でほかの待ちはない。優先度継承の働きはどれか。

アプリで毎日学習しよう

ゲーミフィケーションで 応用情報技術者 合格を目指す。無料・課金なし。

更新: 2026/10/28