複数のスレッドがデータを共有すると、それらの操作が多段更新の途中で インターリーブ (interleave) し、レースコンディション (race condition) — 結果が予測不能なタイミングに依存するバグ — を生みます。同期 (synchronization) は安全な順序を強制するツール群です。
問題: レースコンディション
count++ はアトミックに見えますが、実際には read-modify-write です:
c
複数のスレッドがデータを共有すると、それらの操作が多段更新の途中で インターリーブ (interleave) し、レースコンディション (race condition) — 結果が予測不能なタイミングに依存するバグ — を生みます。同期 (synchronization) は安全な順序を強制するツール群です。
count++ はアトミックに見えますが、実際には read-modify-write です:
読み取りと書き込みの間の窓が critical section — 共有状態に触れ、並行実行してはならないコード — です。
pthread_mutex_lock(&m);
count++; // クリティカルセクション — 排他的
pthread_mutex_unlock(&m);
lock はレースを解決しますが新たなリスクを持ち込みます: デッドロック (スレッドが互いの lock を待つ)、優先度逆転 (priority inversion)、競合 (contention) (スレッドが直列化され並列性が失われる)。経験則: critical section を 短く 保ち、複数の lock は常に 一貫したグローバル順序 で獲得すること。
並行性 (concurrency) のバグは最も見つけにくい部類です — 非決定的で、デバッガの下ではしばしば消えます。面接官は、あなたが critical section を 見抜き、正しいプリミティブ (mutex vs semaphore vs atomic) を選び、故障モード (デッドロック、競合) を推論できるかを見たいのです。これはあらゆるマルチスレッドサーバー、共有キャッシュ、カウンタに直接当てはまります。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する