知識マップ: スプリアスウェイクアップ ── 条件変数が「通知なしに目覚める」理由とWindowsでの正しい待ち方

記事「スプリアスウェイクアップ ── 条件変数が「通知なしに目覚める」理由とWindowsでの正しい待ち方」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

条件変数のwaitは、通知が来ていなくても戻ることがあります。Win32の公式ドキュメントは、スプリアスウェイクアップと、起こされたスレッドより先に別のスレッドが条件を消費する横取りの両方があると明記しています。3つのどの経路で戻ってきたかを呼び出し側は区別できないため、取れる戦略は「戻るたびに条件そのものを確認し、成立していなければもう一度眠る」しかありません。これはWindows固有の癖ではなく、POSIXもC++規格も同じで、ちょうど1つのスレッドだけを確実に起こす通知を厳密に実装すると条件変数のすべての操作に余分な同期コストがかかるという性能上の判断です。しかも横取りは実装を磨いても消せないため、待機側の再確認ループはどのみち必須になります。鏡像の問題が起こし損ねで、条件の確認と更新を同じロックの中で行えば防げます。

条件変数のスプリアスウェイクアップの知識マップwaitから戻る3つの経路と呼び出し側が区別できないこと、性能とのトレードオフとして仕様が許した経緯、述語のwhileループによる対処、起こし損ねとの対比、PulseEventがカーネルAPCで通知を落とす問題を示す図原因になり得る原因になり得る利用する利用する防止する実装を担う利用する原因になり得る原因になり得る原因になり得る前提とする原因になり得る防止する原因になり得る原因になり得る原因になり得るの後継スプリアスウェイクアップ述語のwhileループ再確認Win32の条件変数横取り(stolen wakeup)CRITICAL_SECTIONSRWロック(Slim Reader/Writer Lock)競合状態(race condition)述語付きwait(lock, pred)std::condition_variableWaitOnAddressMonitor.Wait / Pulse / PulseAll起こし損ね(lost wakeup)デッドロック(deadlock)PulseEventカーネルモードAPC

概念間の関係(全17件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

スプリアスウェイクアップ
通知がないのに条件変数の待機から目覚めてしまう現象。
述語のwhileループ再確認
待機操作から戻るたびに待っていた条件そのものを確認し、成立していなければもう一度待つ書き方。
Win32の条件変数
InitializeConditionVariableで作り、SleepConditionVariableCS/SRWで待ち、WakeConditionVariableで起こすWin32の待ち合わせ機構。
述語付きwait(lock, pred)
実質的に while (!pred()) wait(lock); を実行する、C++の条件変数の待機オーバーロード。
std::condition_variable
ミューテックスと組み合わせて、条件が満たされるまでスレッドを待たせるC++の同期プリミティブ。
WaitOnAddress
指定アドレスの値が変わるのを待つ、条件変数より原始的な待機API。シグナル時に戻ることは保証されるが、それ以外の理由で戻ることも許されている。
Monitor.Wait / Pulse / PulseAll
ロックを解放して待機キューに入り、Pulse系で起こされてレディキューへ移り、ロックを取り直してから戻る.NETの待ち合わせ。
起こし損ね(lost wakeup)
待機側がロックの外で条件を見てから待機に入るまでの隙間に通知が通り過ぎ、二度と来ない通知を待ち続けること。
PulseEvent
手動リセットイベントで「今待っている全員を起こしてすぐ非シグナルに戻す」API。マイクロソフト自身が信頼できないため使うべきでないとしている。
カーネルモードAPC
プリエンプティブに実行され、待機APIを戻すことなくシステムが内部的に待機を中断・再開させる仕組み。アプリ側から制御できない。

機械可読データ

このデータセットについて

作成
合同会社小村ソフト
ライセンス
CC BY 4.0 ── 出典(合同会社小村ソフト)とライセンスへのリンクを明示し、改変した場合はその旨を示すことを条件に、再配布・改変を含めて再利用できます
最終確認日
2026-08-22 ── 収録する関係のうち、最後に出典と照合した日

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。