@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-dotnet/#article>
    schema:about <https://comcomponent.com/knowledge/race-condition/>, <https://comcomponent.com/knowledge/shared-mutable-state/> ;
    schema:mentions <https://comcomponent.com/knowledge/deadlock/>, <https://comcomponent.com/knowledge/manual-thread-creation/>, <https://comcomponent.com/knowledge/task-parallel-library/>, <https://comcomponent.com/knowledge/managed-thread-pool/>, <https://comcomponent.com/knowledge/parallel-for/>, <https://comcomponent.com/knowledge/parallel-overhead/>, <https://comcomponent.com/knowledge/thread-local-state/>, <https://comcomponent.com/knowledge/asynchronous-io/>, <https://comcomponent.com/knowledge/channel-t/>, <https://comcomponent.com/knowledge/backpressure/>, <https://comcomponent.com/knowledge/blockingcollection/>, <https://comcomponent.com/knowledge/concurrent-collection/>, <https://comcomponent.com/knowledge/dedicated-lock-object/>, <https://comcomponent.com/knowledge/lock-ordering/>, <https://comcomponent.com/knowledge/monitor-tryenter/>, <https://comcomponent.com/knowledge/interlocked/>, <https://comcomponent.com/knowledge/readerwriterlockslim/>, <https://comcomponent.com/knowledge/semaphoreslim/>, <https://comcomponent.com/knowledge/plain-await/>, <https://comcomponent.com/knowledge/cancellation-token/>, <https://comcomponent.com/knowledge/cooperative-cancellation/>, <https://comcomponent.com/knowledge/thread-abort/>, <https://comcomponent.com/knowledge/wait-handle/>, <https://comcomponent.com/knowledge/polling-wait/>, <https://comcomponent.com/knowledge/ui-thread-context/>, <https://comcomponent.com/knowledge/control-invoke/>, <https://comcomponent.com/knowledge/wpf-dispatcher/>, <https://comcomponent.com/knowledge/lock-statement/> .

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

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

<https://comcomponent.com/knowledge/monitor-tryenter/> a skos:Concept ;
    skos:prefLabel "Monitor.TryEnter(タイムアウト付き)"@ja ;
    skos:definition "指定時間内にロックを取得できなければ諦めて戻る、タイムアウト付きのロック取得。"@ja .

<https://comcomponent.com/knowledge/task-parallel-library/> a skos:Concept ;
    skos:prefLabel "TPL(Task Parallel Library)"@ja ;
    skos:definition ".NET Framework 4以降のマルチスレッド・並列コードの推奨手段となるAPI群。仕事の分割・スレッドプールへのスケジューリング・キャンセル対応・状態管理を引き受ける。"@ja ;
    skos:altLabel "TPL" ;
    ks:succeeds <https://comcomponent.com/knowledge/manual-thread-creation/> ;
    ks:uses <https://comcomponent.com/knowledge/managed-thread-pool/> .

<https://comcomponent.com/knowledge/manual-thread-creation/> a skos:Concept ;
    skos:prefLabel "スレッドの自作(new Thread)"@ja ;
    skos:definition "上位のAPIに任せず、スレッドオブジェクトを直接生成してライフサイクルを自分で管理する書き方。"@ja .

<https://comcomponent.com/knowledge/managed-thread-pool/> a skos:Concept ;
    skos:prefLabel "マネージドスレッドプール"@ja ;
    skos:definition "システムが管理するワーカースレッドのプールを提供し、開発者がスレッド管理ではなくアプリのタスクに集中できるようにする仕組み。"@ja ;
    ks:automates <https://comcomponent.com/knowledge/manual-thread-creation/> .

<https://comcomponent.com/knowledge/asynchronous-io/> a skos:Concept ;
    skos:prefLabel "非同期I/O"@ja ;
    skos:definition "要求を発行した呼び出しがI/Oの完了を待たずにすぐ戻り、完了を別途の通知(イベント・APC・I/O完了ポートなど)で受け取るI/Oの形態。"@ja ;
    skos:altLabel "Asynchronous I/O" ;
    skos:altLabel "オーバーラップI/O"@ja ;
    ks:uses <https://comcomponent.com/knowledge/managed-thread-pool/> .

<https://comcomponent.com/knowledge/parallel-for/> a skos:Concept ;
    skos:prefLabel "Parallel.For / Parallel.ForEach"@ja ;
    skos:definition "forループとほぼ同じ書き味でデータ並列を提供するTPLのAPI。データソースの分割と負荷の再配分をランタイムが行う。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/task-parallel-library/> .

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

<https://comcomponent.com/knowledge/thread-local-state/> a skos:Concept ;
    skos:prefLabel "スレッドローカル状態"@ja ;
    skos:definition "各スレッドが自分だけの領域に持つ中間状態。並列ループで共有メモリへ書き込まずに集計するために使う。"@ja .

<https://comcomponent.com/knowledge/channel-t/> a skos:Concept ;
    skos:prefLabel "Channel<T>"@ja ;
    skos:definition "producer/consumerの形をWriteAsync/ReadAsyncで書けるキュー。境界付き(bounded)にするとbackpressureが働く。"@ja ;
    skos:altLabel "System.Threading.Channels" ;
    ks:prevents <https://comcomponent.com/knowledge/shared-mutable-state/> .

<https://comcomponent.com/knowledge/backpressure/> a skos:Concept ;
    skos:prefLabel "backpressure"@ja ;
    skos:definition "流し込みが速すぎるときに、書き込み側を待たせて増えすぎを防ぐ仕組み。"@ja ;
    skos:altLabel "バックプレッシャー"@ja .

<https://comcomponent.com/knowledge/blockingcollection/> a skos:Concept ;
    skos:prefLabel "BlockingCollection<T>"@ja ;
    skos:definition "ブロッキングと容量制限を備えた同期的なプロデューサー/コンシューマー実装。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/backpressure/> .

<https://comcomponent.com/knowledge/concurrent-collection/> a skos:Concept ;
    skos:prefLabel "スレッドセーフなコレクション型"@ja ;
    skos:definition "System.Collections.Concurrent名前空間が提供する、複数スレッドから同時に更新しても壊れないコレクション型。通常のハッシュテーブルやListの代わりに使う。"@ja ;
    skos:altLabel "System.Collections.Concurrent" ;
    skos:altLabel "ConcurrentDictionary" ;
    skos:altLabel "ConcurrentBag" ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/backpressure/> .

<https://comcomponent.com/knowledge/dedicated-lock-object/> a skos:Concept ;
    skos:prefLabel "専用ロックオブジェクト"@ja ;
    skos:definition "外部に公開しない、ロック専用のインスタンス。.NET 9 / C# 13以降はSystem.Threading.Lock型を使う。"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/deadlock/> .

<https://comcomponent.com/knowledge/lock-statement/> a skos:Concept ;
    skos:prefLabel "lockステートメント"@ja ;
    skos:definition "C#のlockステートメントとSystem.Threading.Lock型によるモニターベースの排他。取得したスレッドが解放も担うスレッド親和性を持つ。"@ja ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/plain-await/> .

<https://comcomponent.com/knowledge/plain-await/> a skos:Concept ;
    skos:prefLabel "plain await"@ja ;
    skos:definition "ConfigureAwait(false)を付けない既定のawait。その時点のSynchronizationContext.Current(無ければTaskScheduler.Current)を捕まえ、完了後の継続をそこへ戻そうとする。"@ja ;
    skos:altLabel "素のawait"@ja ;
    skos:altLabel "ConfigureAwaitなしのawait"@ja .

<https://comcomponent.com/knowledge/semaphoreslim/> a skos:Concept ;
    skos:prefLabel "SemaphoreSlim"@ja ;
    skos:definition "WaitAsyncで非同期に入り、Releaseで抜ける.NETの同期プリミティブ。並列数の上限指定や、awaitをまたぐ排他制御に使う。"@ja ;
    ks:implements <https://comcomponent.com/knowledge/dedicated-lock-object/> .

<https://comcomponent.com/knowledge/interlocked/> a skos:Concept ;
    skos:prefLabel "Interlocked"@ja ;
    skos:definition "単一変数の原子的な増減・加算・比較交換を提供するクラス。競合がなければ単一のCPU命令プレフィックスで済む。"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/race-condition/> .

<https://comcomponent.com/knowledge/readerwriterlockslim/> a skos:Concept ;
    skos:prefLabel "ReaderWriterLockSlim"@ja ;
    skos:definition "書き込みは排他、読み取りは同時アクセス可とする同期プリミティブ。"@ja .

<https://comcomponent.com/knowledge/cancellation-token/> a skos:Concept ;
    skos:prefLabel "CancellationToken"@ja ;
    skos:definition "キャンセル要求を伝えるための構造体。CancellationTokenSourceが要求を出し、リスナーがそれを監視する。"@ja ;
    skos:altLabel "CancellationTokenSource" ;
    ks:implements <https://comcomponent.com/knowledge/cooperative-cancellation/> ;
    ks:uses <https://comcomponent.com/knowledge/wait-handle/> .

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

<https://comcomponent.com/knowledge/wait-handle/> a skos:Concept ;
    skos:prefLabel "待機ハンドルによる待機"@ja ;
    skos:definition "ManualResetEventSlimやSemaphoreSlimなどの同期プリミティブで、シグナル状態になるまでスレッドを休ませる待ち方。"@ja ;
    ks:succeeds <https://comcomponent.com/knowledge/polling-wait/> .

<https://comcomponent.com/knowledge/thread-abort/> a skos:Concept ;
    skos:prefLabel "Thread.Abort"@ja ;
    skos:definition "外部からスレッドに例外を投げ込んで強制終了させようとする、旧世代のスレッド停止手段。"@ja .

<https://comcomponent.com/knowledge/polling-wait/> a skos:Concept ;
    skos:prefLabel "ポーリングによる待機"@ja ;
    skos:definition "フラグが立つまで短い休止を挟んだループで確認し続ける待ち方。"@ja .

<https://comcomponent.com/knowledge/control-invoke/> a skos:Concept ;
    skos:prefLabel "Control.Invoke / InvokeAsync"@ja ;
    skos:definition "WinFormsで、別スレッドからUIスレッドへ処理を依頼するためのメソッド。"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/ui-thread-context/> .

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

<https://comcomponent.com/knowledge/wpf-dispatcher/> a skos:Concept ;
    skos:prefLabel "Dispatcher(WPF)"@ja ;
    skos:definition "WPFのUIスレッド上で処理を順番に実行するためのメッセージキューを管理するクラス。DispatcherTimerのTickもこのキューに積まれる。"@ja ;
    skos:altLabel "System.Windows.Threading.Dispatcher" ;
    skos:altLabel "UIスレッドのメッセージキュー"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/ui-thread-context/> .

[] 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://learn.microsoft.com/dotnet/standard/threading/managed-threading-best-practices> ;
    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 "スレッドAがロック1を持ってロック2を待ち、スレッドBがロック2を持ってロック1を待つのが古典的なデッドロックのパターンで、全スレッドが同じ順序でロックを取ると決めることで断てる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/managed-threading-best-practices> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/deadlock/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/monitor-tryenter/> ;
    schema:description "順序を保証できない箇所ではMonitor.TryEnterのタイムアウト付きオーバーロードを使い、取れなければ手放してやり直すことで、永遠のハングを検出可能な失敗に変えられる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/managed-threading-best-practices> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/task-parallel-library/> ;
    rdf:predicate ks:succeeds ;
    rdf:object <https://comcomponent.com/knowledge/manual-thread-creation/> ;
    schema:description "TPLは.NET Framework 4以降のマルチスレッド・並列コードの推奨手段で、並列度を利用可能なプロセッサに合わせて動的に調整し、仕事の分割・スレッドプールへのスケジューリング・キャンセル対応・状態管理を引き受ける。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/parallel-programming/task-parallel-library-tpl> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/task-parallel-library/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/managed-thread-pool/> ;
    schema:description "TPLの操作はスレッドプールへスケジューリングされる。TPLを使うにもロック・デッドロック・競合状態の基本理解は必要とされている。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/parallel-programming/task-parallel-library-tpl>, <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/managed-thread-pool/> ;
    rdf:predicate ks:automates ;
    rdf:object <https://comcomponent.com/knowledge/manual-thread-creation/> ;
    schema:description "ThreadPoolクラスがシステム管理のワーカースレッドのプールを提供するため、開発者はスレッド管理ではなくアプリのタスクに集中できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/asynchronous-io/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/managed-thread-pool/> ;
    schema:description ".NETはTPLの操作だけでなく、非同期I/Oの完了・タイマーコールバック・登録済み待機・ソケット接続など広範にスレッドプールを使っている。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/parallel-for/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/task-parallel-library/> ;
    schema:description "Parallel.For / Parallel.ForEachはforループとほぼ同じ書き味でデータ並列を提供し、スレッドの作成やワークアイテムのキューイングは不要で、基本的なループではロックも要らない。TPLがデータソースを分割し、負荷が偏れば再配分する。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/parallel-programming/data-parallelism-task-parallel-library> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/parallel-for/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/parallel-overhead/> ;
    schema:description "反復回数が少ない、または1反復の仕事が小さいループでは、並列化のオーバーヘッドが本体を上回って逐次より遅くなる。性能は要因が多いので必ず測定して判断する。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/parallel-programming/potential-pitfalls-in-data-and-task-parallelism>, <https://learn.microsoft.com/dotnet/standard/parallel-programming/task-parallel-library-tpl> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/parallel-for/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/deadlock/> ;
    schema:description "Parallel.For / ForEachの各反復が並列に実行される保証はないため、ある反復が別の反復のイベント設定を待つようなコードはスケジューリング次第でデッドロックする。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/parallel-programming/potential-pitfalls-in-data-and-task-parallelism> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/thread-local-state/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/shared-mutable-state/> ;
    schema:description "並列ループ内では共有メモリへの書き込みを避けるべきとされており、スレッドローカル状態を使うオーバーロードが推奨されている。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/parallel-programming/potential-pitfalls-in-data-and-task-parallelism> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/channel-t/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/shared-mutable-state/> ;
    schema:description "共有変数を両側から触る代わりに、プロデューサーが書きコンシューマーが読むFIFOを間に置けば、同期はチャネルが内部で管理する。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/channels> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/channel-t/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/backpressure/> ;
    schema:description "CreateBoundedで容量上限付きのチャネルを作ると、上限到達時の既定動作は書き込み側の待機になり、書き込みが読み出しより速い場合に背圧がかかる。DropOldestなど他のFullModeも選べる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/core/extensions/channels> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/blockingcollection/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/backpressure/> ;
    schema:description "容量を指定したBlockingCollectionは、容量制限によって生産側が消費側を追い越しすぎるのを防ぐ。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.collections.concurrent.blockingcollection-1> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/channel-t/> ;
    rdf:predicate ks:succeeds ;
    rdf:object <https://comcomponent.com/knowledge/blockingcollection/> ;
    schema:description "BlockingCollectionは非同期アクセスを想定した設計ではないため、非同期のプロデューサー/コンシューマーにはChannel<T>の使用を検討すべきとされている。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.collections.concurrent.blockingcollection-1> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/concurrent-collection/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/backpressure/> ;
    schema:description "ConcurrentQueueとConcurrentStackはロックを使わずInterlocked操作で実装された高速なコレクションだが、容量制限も「空になったら待つ」仕組みも持たない素のスレッドセーフキューである。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/collections/thread-safe/> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dedicated-lock-object/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/deadlock/> ;
    schema:description "型やthisをロック対象にしてはならない。lock(this)は自分のインスタンスを参照できる外部コードと、lock(typeof(X))はより広い範囲とロックを共有してしまう。専用ロックはこうした意図しないロック共有を避けるが、複数ロックを一貫しない順序で取るデッドロックには順序の規律が別途必要。.NET 9 / C# 13以降は専用のSystem.Threading.Lockインスタンスを使う。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/managed-threading-best-practices> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/lock-statement/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/plain-await/> ;
    schema:description "C#のlockステートメントとLock型はスレッド親和性を持つため、awaitをまたいで使えない。awaitの前後で継続を実行するスレッドが替わりうるためである。カウント1のSemaphoreSlimならWaitAsyncでawaitと組み合わせられる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/asynchronous-programming-patterns/async-coordination-primitives-advanced> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/semaphoreslim/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/dedicated-lock-object/> ;
    schema:description "非同期コードでの相互排他には、カウント1のSemaphoreSlimをWaitAsyncとtry/finallyのReleaseで使う。SemaphoreSlimはプロセス内専用の軽量セマフォで、プロセス間同期には名前付きのSemaphoreを使う。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/asynchronous-programming-patterns/async-coordination-primitives-advanced>, <https://learn.microsoft.com/dotnet/standard/threading/overview-of-synchronization-primitives> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/interlocked/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/race-condition/> ;
    schema:description "カウンターの増減やフラグの入れ替えのような単一変数の原子的更新は、lockよりInterlockedが高速で、競合がなければ単一のCPU命令プレフィックスで済む。複数の変数をまとめて整合させる用途には使えない。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/managed-threading-best-practices> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/readerwriterlockslim/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/race-condition/> ;
    schema:description "ReaderWriterLockSlimは書き込みだけを排他して読み取りは同時アクセスを許すため、読み取りが頻繁で書き込みがまれな共有データに向く。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/overview-of-synchronization-primitives> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cancellation-token/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/cooperative-cancellation/> ;
    schema:description "CancellationTokenSourceとCancellationTokenによるモデルでは、キャンセルは強制ではなく協調であり、停止の仕方はリスナー側が決める。ライブラリは公開メソッドでCancellationTokenを受け取るべきとされている。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/cancellation-in-managed-threads> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cancellation-token/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/wait-handle/> ;
    schema:description "キャンセル要求の監視手段は、ポーリング・コールバック登録・待機ハンドルの3つである。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/cancellation-in-managed-threads> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/cooperative-cancellation/> ;
    rdf:predicate ks:succeeds ;
    rdf:object <https://comcomponent.com/knowledge/thread-abort/> ;
    schema:description "スレッドの停止にはCancellationTokenを使うべきで、.NET Coreおよび.NET 5以降ではThread.AbortがPlatformNotSupportedExceptionを投げ、.NET 5以降はコンパイル時にも非推奨警告(SYSLIB0006)になる。協調キャンセルに応じないサードパーティコードは別プロセスで実行してProcess.Killで止める。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/using-threads-and-threading> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wait-handle/> ;
    rdf:predicate ks:succeeds ;
    rdf:object <https://comcomponent.com/knowledge/polling-wait/> ;
    schema:description "フラグが立つまで短い休止のループで待つ書き方はCPUと応答性の両方を無駄にする。同期プリミティブを使えば、シグナル状態になるまでスレッドを正しく休ませられる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/overview-of-synchronization-primitives> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/control-invoke/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/ui-thread-context/> ;
    schema:description "WinFormsのコントロールはスレッドセーフではなく、複数スレッドからの操作は不整合状態・競合・デッドロック・フリーズを招く。すべてのコントロールは同一スレッドで作成・アクセスされる必要があり、別スレッドからはControl.Invoke、.NET 9以降のControl.InvokeAsync、またはBackgroundWorkerを使う。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/control-invoke/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/deadlock/> ;
    schema:description "同期形のInvokeは、UIスレッドがそのワーカーの完了を同期的に待っている状態でワーカーから呼ばれると互いを待ち合う。バックグラウンドからの通知・進捗報告は非同期形を既定にする。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/desktop/winforms/controls/how-to-make-thread-safe-calls> ;
    ks:verifiedAt "2026-08-02" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wpf-dispatcher/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/ui-thread-context/> ;
    schema:description "WPFでもUIを変更できるのは1つのスレッドに限られ、バックグラウンドスレッドはUIスレッドのDispatcherに作業項目を登録して依頼する。Dispatcher.Invokeが同期、InvokeAsyncとBeginInvokeが非同期である。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/desktop/wpf/advanced/threading-model> ;
    ks:verifiedAt "2026-08-22" ;
    ks:certainty "established" .
