@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/multithreading-best-practices-cpp/#article>
    schema:about <https://comcomponent.com/knowledge/data-race-undefined-behavior/>, <https://comcomponent.com/knowledge/shared-mutable-state/> ;
    schema:mentions <https://comcomponent.com/knowledge/race-condition/>, <https://comcomponent.com/knowledge/deadlock/>, <https://comcomponent.com/knowledge/raii/>, <https://comcomponent.com/knowledge/std-thread/>, <https://comcomponent.com/knowledge/std-jthread/>, <https://comcomponent.com/knowledge/std-terminate/>, <https://comcomponent.com/knowledge/std-stop-token/>, <https://comcomponent.com/knowledge/cooperative-cancellation/>, <https://comcomponent.com/knowledge/std-async-future/>, <https://comcomponent.com/knowledge/ppl-parallel-for/>, <https://comcomponent.com/knowledge/cpp-parallel-algorithms/>, <https://comcomponent.com/knowledge/parallel-overhead/>, <https://comcomponent.com/knowledge/std-mutex/>, <https://comcomponent.com/knowledge/std-scoped-lock/>, <https://comcomponent.com/knowledge/lock-ordering/>, <https://comcomponent.com/knowledge/std-shared-mutex/>, <https://comcomponent.com/knowledge/std-atomic/>, <https://comcomponent.com/knowledge/volatile-keyword/>, <https://comcomponent.com/knowledge/std-condition-variable/>, <https://comcomponent.com/knowledge/spurious-wakeup/>, <https://comcomponent.com/knowledge/win32-sync-object/>, <https://comcomponent.com/knowledge/in-process-mutual-exclusion/>, <https://comcomponent.com/knowledge/srw-lock/>, <https://comcomponent.com/knowledge/dllmain-loader-lock/>, <https://comcomponent.com/knowledge/ui-thread-context/>, <https://comcomponent.com/knowledge/postmessage-ui-dispatch/>, <https://comcomponent.com/knowledge/std-condition-variable-any/>, <https://comcomponent.com/knowledge/multi-variable-invariant/> .

<https://comcomponent.com/knowledge/data-race-undefined-behavior/> a skos:Concept ;
    skos:prefLabel "データ競合による未定義動作"@ja ;
    skos:definition "同じメモリ位置へ複数スレッドが同期なしにアクセスし、少なくとも一方が書き込みであるときにC++規格が定める未定義動作。コンパイラは競合が存在しない前提で最適化する。"@ja .

<https://comcomponent.com/knowledge/shared-mutable-state/> a skos:Concept ;
    skos:prefLabel "共有可変状態"@ja ;
    skos:definition "複数のスレッドから読み書きされる、書き換え可能なデータ。競合はこれと複数スレッドが揃ったときにだけ起きる。"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/race-condition/> ;
    ks:mayCause <https://comcomponent.com/knowledge/data-race-undefined-behavior/> .

<https://comcomponent.com/knowledge/race-condition/> a skos:Concept ;
    skos:prefLabel "競合状態(race condition)"@ja ;
    skos:definition "複数のスレッドがどの順序で特定のコードに到達するかによって結果が変わってしまう不具合。"@ja ;
    skos:altLabel "レースコンディション"@ja .

<https://comcomponent.com/knowledge/volatile-keyword/> a skos:Concept ;
    skos:prefLabel "volatile"@ja ;
    skos:definition "最適化による読み書きの除去を抑える型修飾子。スレッド間の同期を保証するものではない。"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/data-race-undefined-behavior/> .

<https://comcomponent.com/knowledge/std-thread/> a skos:Concept ;
    skos:prefLabel "std::thread"@ja ;
    skos:definition "C++11のスレッドクラス。合流(join)と切り離し(detach)を呼び出し側が管理する。"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/std-terminate/> ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/dllmain-loader-lock/> .

<https://comcomponent.com/knowledge/std-terminate/> a skos:Concept ;
    skos:prefLabel "std::terminate"@ja ;
    skos:definition "回復不能とみなされた状況で呼ばれ、プロセスを異常終了させる関数。"@ja .

<https://comcomponent.com/knowledge/std-jthread/> a skos:Concept ;
    skos:prefLabel "std::jthread"@ja ;
    skos:definition "C++20のスレッドクラス。デストラクタで自動的に停止要求を出してからjoinし、スレッド関数の先頭引数としてstop_tokenを受け取れる。"@ja ;
    ks:succeeds <https://comcomponent.com/knowledge/std-thread/> ;
    ks:implements <https://comcomponent.com/knowledge/raii/> ;
    ks:uses <https://comcomponent.com/knowledge/std-stop-token/> .

<https://comcomponent.com/knowledge/raii/> a skos:Concept ;
    skos:prefLabel "RAII(Resource Acquisition Is Initialization)"@ja ;
    skos:definition "オブジェクトの生成時に資源を確保し、デストラクタでの解放を保証することで、途中失敗時にも資源が漏れないようにするC++の設計パターン。"@ja ;
    skos:altLabel "RAII" .

<https://comcomponent.com/knowledge/std-stop-token/> a skos:Concept ;
    skos:prefLabel "std::stop_token"@ja ;
    skos:definition "停止要求が出されたかをスレッド側から観測するためのC++20の型。condition_variable_anyのwaitにも直接渡せる。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/cooperative-cancellation/> .

<https://comcomponent.com/knowledge/cooperative-cancellation/> a skos:Concept ;
    skos:prefLabel "協調キャンセル"@ja ;
    skos:definition "キャンセルを強制ではなく要求として伝え、停止の仕方はリスナー側が決めるモデル。"@ja .

<https://comcomponent.com/knowledge/std-condition-variable-any/> a skos:Concept ;
    skos:prefLabel "std::condition_variable_any"@ja ;
    skos:definition "任意のロック型と組み合わせられるC++の条件変数。waitがstd::stop_tokenを直接受け取れる点がstd::condition_variableと異なる。"@ja ;
    ks:uses <https://comcomponent.com/knowledge/std-stop-token/> .

<https://comcomponent.com/knowledge/std-async-future/> a skos:Concept ;
    skos:prefLabel "std::async / std::future"@ja ;
    skos:definition "一発の非同期タスクを起動し、その結果をfutureで受け取るC++11の仕組み。"@ja .

<https://comcomponent.com/knowledge/parallel-overhead/> a skos:Concept ;
    skos:prefLabel "並列化のオーバーヘッド"@ja ;
    skos:definition "仕事を分割してスレッドへ配り、結果をまとめるために生じる追加のコスト。1回あたりの仕事が軽いと本体を上回る。"@ja .

<https://comcomponent.com/knowledge/ppl-parallel-for/> a skos:Concept ;
    skos:prefLabel "PPLのparallel_for / parallel_for_each"@ja ;
    skos:definition "コレクションの全要素へ処理を並列に適用する、Parallel Patterns Libraryのアルゴリズム。"@ja .

<https://comcomponent.com/knowledge/cpp-parallel-algorithms/> a skos:Concept ;
    skos:prefLabel "C++17の並列アルゴリズム(std::execution::par)"@ja ;
    skos:definition "標準アルゴリズムに実行ポリシーを渡して並列実行させるC++17の仕組み。"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/std-terminate/> .

<https://comcomponent.com/knowledge/std-scoped-lock/> a skos:Concept ;
    skos:prefLabel "std::scoped_lock"@ja ;
    skos:definition "C++17のRAIIロックラッパー。構築時に1つ以上のミューテックスを取得し、デストラクタで解放する。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/raii/> ;
    ks:prevents <https://comcomponent.com/knowledge/deadlock/> ;
    ks:configuredBy <https://comcomponent.com/knowledge/std-mutex/> .

<https://comcomponent.com/knowledge/deadlock/> a skos:Concept ;
    skos:prefLabel "デッドロック(deadlock)"@ja ;
    skos:definition "複数のタスクが互いの完了やリソース解放を待ち続け、永遠に進行しなくなる状態である。"@ja ;
    skos:altLabel "Deadlock" .

<https://comcomponent.com/knowledge/lock-ordering/> a skos:Concept ;
    skos:prefLabel "ロック取得順序の統一"@ja ;
    skos:definition "複数のロックを取るとき、全スレッドが同じ順序で取ると決めるルール。"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/deadlock/> .

<https://comcomponent.com/knowledge/std-mutex/> a skos:Concept ;
    skos:prefLabel "std::mutex"@ja ;
    skos:definition "プロセス内の相互排他を提供するC++標準ライブラリのミューテックス。"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/in-process-mutual-exclusion/> .

<https://comcomponent.com/knowledge/std-shared-mutex/> a skos:Concept ;
    skos:prefLabel "std::shared_mutex"@ja ;
    skos:definition "読み取りを同時に許し、書き込みだけを排他するC++14の読み書きミューテックス。"@ja .

<https://comcomponent.com/knowledge/std-atomic/> a skos:Concept ;
    skos:prefLabel "std::atomic"@ja ;
    skos:definition "単一変数への不可分な操作と、memory_orderにもとづく順序付けを提供するC++のテンプレート。"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/race-condition/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/multi-variable-invariant/> .

<https://comcomponent.com/knowledge/multi-variable-invariant/> a skos:Concept ;
    skos:prefLabel "複数変数にまたがる不変条件"@ja ;
    skos:definition "複数の共有変数を同時に整合した状態に保つ必要がある条件。単一変数のアトミック操作では守れず、ロックでまとめて保護する。"@ja .

<https://comcomponent.com/knowledge/std-condition-variable/> a skos:Concept ;
    skos:prefLabel "std::condition_variable"@ja ;
    skos:definition "ミューテックスと組み合わせて、条件が満たされるまでスレッドを待たせるC++の同期プリミティブ。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/std-mutex/> ;
    ks:mayCause <https://comcomponent.com/knowledge/spurious-wakeup/> .

<https://comcomponent.com/knowledge/spurious-wakeup/> a skos:Concept ;
    skos:prefLabel "スプリアスウェイクアップ"@ja ;
    skos:definition "通知がないのに条件変数の待機から目覚めてしまう現象。"@ja .

<https://comcomponent.com/knowledge/in-process-mutual-exclusion/> a skos:Concept ;
    skos:prefLabel "プロセス内の相互排他"@ja ;
    skos:definition "同一プロセス内のスレッド間で、共有データへのアクセスを排他したいという要件。"@ja .

<https://comcomponent.com/knowledge/srw-lock/> a skos:Concept ;
    skos:prefLabel "SRWロック(Slim Reader/Writer Lock)"@ja ;
    skos:definition "Win32が提供する軽量な読み書きロック。再帰取得はできない。"@ja ;
    skos:altLabel "SRWLOCK" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/in-process-mutual-exclusion/> .

<https://comcomponent.com/knowledge/win32-sync-object/> a skos:Concept ;
    skos:prefLabel "Win32同期オブジェクト"@ja ;
    skos:definition "イベント・Mutex・セマフォなど、Win32の待機APIで待てるカーネルオブジェクト。プロセスをまたいだ同期にも使える。"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/in-process-mutual-exclusion/> .

<https://comcomponent.com/knowledge/dllmain-loader-lock/> a skos:Concept ;
    skos:prefLabel "DllMainとローダーロック"@ja ;
    skos:definition "DllMainがローダーロックを保持した状態で呼ばれるという制約。呼べるAPIが大きく限られる。"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/deadlock/> .

<https://comcomponent.com/knowledge/postmessage-ui-dispatch/> a skos:Concept ;
    skos:prefLabel "PostMessageによるUIスレッドへの依頼"@ja ;
    skos:definition "ワーカースレッドから直接ウィンドウを触らず、非同期のメッセージ送出でUIスレッドに処理を依頼する形。"@ja .

<https://comcomponent.com/knowledge/ui-thread-context/> a skos:Concept ;
    skos:prefLabel "UIスレッドのコンテキスト"@ja ;
    skos:definition "WinForms/WPFなどデスクトップアプリで、UIの応答性を保つために画面更新や重い処理の実行場所として意識されるコンテキスト。"@ja ;
    skos:altLabel "UIイベントハンドラ"@ja .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/shared-mutable-state/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/race-condition/> ;
    schema:description "++countという1つの式も機械語では読み込み・加算・書き戻しの3ステップに分かれるため、2つのスレッドが同時に入ると一方の加算が上書きされて消える。"@ja ;
    ks:evidence <https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#cp-concurrency-and-parallelism> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/shared-mutable-state/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/data-race-undefined-behavior/> ;
    schema:description "C++ Core GuidelinesはCP.1(自分のコードがマルチスレッドで動くと想定せよ)とCP.2(データ競合を避けよ)を並行性の章の冒頭規則に掲げ、データ競合があるとどんな保証も成り立たないとしている。"@ja ;
    ks:evidence <https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#cp-concurrency-and-parallelism> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/volatile-keyword/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/data-race-undefined-behavior/> ;
    schema:description "volatileはスレッド同期の道具ではない。共有フラグ・カウンターにはstd::atomicを、複数変数の保護にはstd::mutexを使う。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/standard-library/atomic> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-thread/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/std-terminate/> ;
    schema:description "スレッドがjoinableなまま(joinもdetachもされないまま)std::threadのデストラクタが呼ばれると、std::terminateが呼ばれてプロセスが即死する。"@ja ;
    ks:evidence <https://en.cppreference.com/w/cpp/thread/thread/%7Ethread> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-jthread/> ;
    rdf:predicate ks:succeeds ;
    rdf:object <https://comcomponent.com/knowledge/std-thread/> ;
    schema:description "C++20のjthreadはstd::threadと異なりデストラクタで自動的にrequest_stop()を呼んでからjoinするため、例外発生時でもスレッドの合流と停止要求が保証される。MSVCではVisual Studio 2019 16.9以降で<stop_token>とjthreadが使える。"@ja ;
    ks:evidence <https://en.cppreference.com/w/cpp/thread/jthread>, <https://learn.microsoft.com/cpp/overview/visual-cpp-language-conformance> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-jthread/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/raii/> ;
    schema:description "スレッドの合流をオブジェクトの寿命で保証する形になるため、try/catchでjoinを書く手動管理が不要になる。"@ja ;
    ks:evidence <https://en.cppreference.com/w/cpp/thread/jthread> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-jthread/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/std-stop-token/> ;
    schema:description "スレッド関数は先頭引数としてstd::stop_tokenを受け取れる。request_stop()で停止要求が立ち、ループはそれを観測して自分で終わる。"@ja ;
    ks:evidence <https://en.cppreference.com/w/cpp/thread/jthread> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-stop-token/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/cooperative-cancellation/> ;
    schema:description "止める側は要求を出すだけで、いつどう終わるかはスレッド自身が後片付きのよい所で決め、joinの完了をもって止まったとみなす。C++にはスレッドを外から安全に止める手段がないため、これが唯一の形になる。"@ja ;
    ks:evidence <https://en.cppreference.com/w/cpp/thread/jthread> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-condition-variable-any/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/std-stop-token/> ;
    schema:description "condition_variable_anyのwaitはstop_tokenを直接受け取れるため、仕事が来るまで待っているスレッドも停止要求で即座に起こせる。std::condition_variableのwaitにはstop_tokenを取るオーバーロードがない。"@ja ;
    ks:evidence <https://en.cppreference.com/w/cpp/thread/jthread> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-async-future/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/parallel-overhead/> ;
    schema:description "std::asyncで起動されたタスクに紐づくfuture(または最後のshared_future)は、タスクが未完了のままデストラクタが走ると共有状態がreadyになるまでブロックする。戻り値のfutureを捨てると同期実行と等価になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/standard-library/future> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ppl-parallel-for/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/parallel-overhead/> ;
    schema:description "各反復の仕事が小さい、または不均衡な並列ループでは、フォーク/ジョインのスケジューリングオーバーヘッドが並列実行の利得を食い潰す。並列化はできるだけ高いレベル(外側のループ)で表現する。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/parallel/concrt/best-practices-in-the-parallel-patterns-library> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cpp-parallel-algorithms/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/std-terminate/> ;
    schema:description "MSVCでは主要なアルゴリズムが並列化されているが、実行ポリシー下の要素処理から例外が漏れるとstd::terminateが呼ばれるため、コールバックの中に自前の例外境界を置く必要がある。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/overview/visual-cpp-language-conformance> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-scoped-lock/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/raii/> ;
    schema:description "scoped_lockは構築時にミューテックスを取得しデストラクタで解放するため、例外が投げられても確実に解放される。lock()/unlock()の手書きは例外や早期リターンで解放漏れを起こす。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/standard-library/scoped-lock-class> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-scoped-lock/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/deadlock/> ;
    schema:description "複数のミューテックスをまとめて渡した場合、scoped_lockはstd::lock相当のデッドロック回避アルゴリズムで取得する。個別に取らずまとめて取ることで、取得順序の問題をライブラリが解決する。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/standard-library/scoped-lock-class> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/lock-ordering/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/deadlock/> ;
    schema:description "同時に取るのではなく順に取る場面では、全スレッドが同じ順序でミューテックスを取ることをルール化する。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/standard-library/scoped-lock-class> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-scoped-lock/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/std-mutex/> ;
    schema:description "ロックの単位はコードの区間ではなくデータで考え、守りたい可変データの集合ごとにミューテックスを1つ対応させて、外部に公開しないprivateメンバーにする。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/sync/about-synchronization> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-shared-mutex/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/race-condition/> ;
    schema:description "読み取りは多いが書き込みはまれなデータには、C++14のstd::shared_mutexで読み書きロックを使える。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/standard-library/cpp-standard-library-header-files> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-atomic/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/race-condition/> ;
    schema:description "アトミック操作は不可分なので、他スレッドからは操作の前か後の状態しか観測できない。memory_order引数にもとづいて他のアトミック操作の可視性への順序付け要件を確立し、それに反するコンパイラ最適化を抑止する。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/standard-library/atomic> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-atomic/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/multi-variable-invariant/> ;
    schema:description "std::atomicでできるのは単一変数の更新までで、複数の変数をまとめて整合させることはできない。その場合はstd::mutexに戻る。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/standard-library/atomic> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-condition-variable/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/std-mutex/> ;
    schema:description "条件変数の待機にはミューテックスが必要で、待機中はロックが外れる。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/standard-library/condition-variable> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-condition-variable/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/spurious-wakeup/> ;
    schema:description "条件変数には通知なしに目覚めるスプリアスウェイクアップが存在するため、待機側は復帰時に条件を明示的に確認すべきであり、述語付きのwaitを使う。"@ja ;
    ks:evidence <https://learn.microsoft.com/cpp/standard-library/condition-variable> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-mutex/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/in-process-mutual-exclusion/> ;
    schema:description "移植性を重視するC++コードには、std::mutex / std::shared_mutexとRAIIによる管理が推奨されている。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/sync/about-synchronization> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/srw-lock/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/in-process-mutual-exclusion/> ;
    schema:description "Win32 APIを直接使う場合、プロセス内の新規コードにはSRWロックが推奨され、再帰が必要なときだけCRITICAL_SECTIONを使う。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/sync/about-synchronization> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/win32-sync-object/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/in-process-mutual-exclusion/> ;
    schema:description "Win32同期オブジェクトの出番は、WaitForMultipleObjectsで複数オブジェクトを同時に待ちたい場合と、プロセスをまたぐ排他・通知に整理されている。通常のプロセス内排他は標準ライブラリで書くほうが移植性・保守性の点で有利になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/sync/about-synchronization> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dllmain-loader-lock/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/deadlock/> ;
    schema:description "DllMainはローダーロックを保持した状態で呼ばれるため、その中で他スレッドと同期する・スレッドの終了を待つ・LoadLibraryを呼ぶといった操作はデッドロックや不定動作の原因になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/dlls/dynamic-link-library-best-practices> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/std-thread/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/dllmain-loader-lock/> ;
    schema:description "スレッドを起動・合流するような初期化はDllMainの外(明示的な初期化関数)に出す必要がある。また/clrでコンパイルされるコードでは<thread>ヘッダー自体がブロックされる。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/dlls/dynamic-link-library-best-practices>, <https://learn.microsoft.com/cpp/standard-library/thread> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/postmessage-ui-dispatch/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/ui-thread-context/> ;
    schema:description "ウィンドウとコントロールはそれを作成したスレッドだけが触れる。ワーカーから画面を更新したいときは直接触らず、非同期のPostMessageでUIスレッドに依頼し、同期形のSendMessageはUIスレッドが自分を待っている状況では互いを待ち合うため既定にしない。"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/sync/about-synchronization> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "context-dependent" .
