デッドロック(deadlock)
複数のタスクが互いの完了やリソース解放を待ち続け、永遠に進行しなくなる状態である。
- 概念URI
https://comcomponent.com/knowledge/deadlock/
- 別名・表記
- Deadlock
- 最終確認日
- 2026-08-01
- 機械可読データ
- JSON-LD
この概念が関わる関係
- 選択的アクセプト(select文)はデッドロック(deadlock)を防ぎます。or terminateにより、誰からも呼ばれなくなったサーバータスクを安全に終了させ、待ち続けるタスクによるデッドロックを避けられる。これは「待ち続けるサーバータスク」という特定のパターンへの対策であり、複数タスク間の循環待ちなど他の形のデッドロックまで防ぐものではない / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- 限定エラー(bounded error)はデッドロック(deadlock)の原因になることがあります。保護操作内でのdelayや特定のI/Oは限定エラーに該当し、処理系によってはデッドロックにつながり得る / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- Ravenscarプロファイルはデッドロック(deadlock)を軽減します。Ravenscarプロファイルはタスクモデルを制限し、静的なデッドロック解析を可能にすることでデッドロックのリスクを下げる / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- ランデブー(rendezvous)はデッドロック(deadlock)を軽減します。ランデブーモデルは構造的な同期を提供し、明示的な終了待ちの呼び忘れのような一部のデッドロック要因を減らす / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- TerminateThreadはデッドロック(deadlock)の原因になることがあります。TerminateThreadは対象スレッドにユーザーモードコードを一切実行させずに終了させるため、対象がクリティカルセクションを保持していれば永遠に解放されず、ヒープ操作中ならヒープロックが握られたままになる。DLLのグローバル状態を操作中ならDLLの状態も破壊される。 / 確度: 確立した関係 / 確認日: 2026-08-02 出典
- ロック取得順序の統一はデッドロック(deadlock)を防ぎます。順序の逆転(lock order inversion)がデバッグ困難なデッドロックを生むため、ロック階層を定義して一貫して従うべきことがDLLのベストプラクティス文書に明文化されている。 / 確度: 確立した関係 / 確認日: 2026-08-02 出典
- DllMainとローダーロックはデッドロック(deadlock)の原因になることがあります。DllMainはローダーロックを保持したまま呼ばれるため、その中で他スレッドと同期する・スレッドの終了を待つ・LoadLibraryを呼ぶといった操作はデッドロックを招く。スレッドを持つDLLは明示的な初期化・終了関数を公開し、DllMainは空に近いスタブにする。 / 確度: 確立した関係 / 確認日: 2026-08-02 出典
- std::scoped_lockはデッドロック(deadlock)を防ぎます。複数のミューテックスをまとめて渡した場合、scoped_lockはstd::lock相当のデッドロック回避アルゴリズムで取得する。個別に取らずまとめて取ることで、取得順序の問題をライブラリが解決する。 / 確度: 確立した関係 / 確認日: 2026-08-02 出典
- ロック取得順序の統一はデッドロック(deadlock)を防ぎます。同時に取るのではなく順に取る場面では、全スレッドが同じ順序でミューテックスを取ることをルール化する。 / 確度: 確立した関係 / 確認日: 2026-08-02 出典
- DllMainとローダーロックはデッドロック(deadlock)の原因になることがあります。DllMainはローダーロックを保持した状態で呼ばれるため、その中で他スレッドと同期する・スレッドの終了を待つ・LoadLibraryを呼ぶといった操作はデッドロックや不定動作の原因になる。 / 確度: 確立した関係 / 確認日: 2026-08-02 出典
- ロック取得順序の統一はデッドロック(deadlock)を防ぎます。スレッドAがロック1を持ってロック2を待ち、スレッドBがロック2を持ってロック1を待つのが古典的なデッドロックのパターンで、全スレッドが同じ順序でロックを取ると決めることで断てる。 / 確度: 確立した関係 / 確認日: 2026-08-02 出典
- デッドロック(deadlock)はMonitor.TryEnter(タイムアウト付き)で確認できます。順序を保証できない箇所ではMonitor.TryEnterのタイムアウト付きオーバーロードを使い、取れなければ手放してやり直すことで、永遠のハングを検出可能な失敗に変えられる。 / 確度: 確立した関係 / 確認日: 2026-08-02 出典
- Parallel.For / Parallel.ForEachはデッドロック(deadlock)の原因になることがあります。Parallel.For / ForEachの各反復が並列に実行される保証はないため、ある反復が別の反復のイベント設定を待つようなコードはスケジューリング次第でデッドロックする。 / 確度: 条件付きの関係 / 確認日: 2026-08-02 出典
- 専用ロックオブジェクトはデッドロック(deadlock)を軽減します。型やthisをロック対象にしてはならない。lock(this)は自分のインスタンスを参照できる外部コードと、lock(typeof(X))はより広い範囲とロックを共有してしまう。専用ロックはこうした意図しないロック共有を避けるが、複数ロックを一貫しない順序で取るデッドロックには順序の規律が別途必要。.NET 9 / C# 13以降は専用のSystem.Threading.Lockインスタンスを使う。 / 確度: 確立した関係 / 確認日: 2026-08-22 出典
- Control.Invoke / InvokeAsyncはデッドロック(deadlock)の原因になることがあります。同期形のInvokeは、UIスレッドがそのワーカーの完了を同期的に待っている状態でワーカーから呼ばれると互いを待ち合う。バックグラウンドからの通知・進捗報告は非同期形を既定にする。 / 確度: 条件付きの関係 / 確認日: 2026-08-02 出典
- ロック取得順序の統一はデッドロック(deadlock)を防ぎます。2つ以上のロックを取る場所では全スレッドが同じ順序で取ることをルール化し、順序を保証できない箇所にはtryLock(timeout)で取れなければ手放してやり直す経路を用意する。 / 確度: 確立した関係 / 確認日: 2026-08-02 出典
- デッドロック(deadlock)はスレッドダンプ(jstack / jcmd)で確認できます。jstack(またはjcmd Thread.print)が全スレッドのスタックトレースを出力し、-lでロックに関する追加情報まで表示できる。ダンプを数秒おきに2〜3回取り、動いていないスレッドがどのロックを待ち、そのロックを誰が握っているかを突き合わせる。 / 確度: 確立した関係 / 確認日: 2026-08-02 出典
- 片方のストリームを同期的にReadToEndで読み切る書き方はデッドロック(deadlock)の原因になることがあります。片方のストリームを同期的に読み切ってからもう片方を読むと、読んでいない側のパイプバッファが埋まって子プロセスが書き込みでブロックし、デッドロックする。 / 確度: 確立した関係 / 確認日: 2026-08-01 出典
- サーバーサイドOffice COM自動化はデッドロック(deadlock)の原因になることがあります。Officeは対話的デスクトップとユーザープロファイルを前提に設計されており、無人・非対話環境で実行すると不安定な動作やデッドロックを起こし得る / 確度: 確立した関係 / 確認日: 2026-08-01 出典
- 起こし損ね(lost wakeup)はデッドロック(deadlock)の原因になることがあります。待機側がロックの外で条件を見て待機に入ろうとした隙間に通知側が状態を更新して通知を送ると、通知は待機者のいない条件変数へ向けて発射されて消え、待機側は二度と来ない通知を待ち続ける。 / 確度: 確立した関係 / 確認日: 2026-08-22 出典
- 同期待ちの混入(sync-over-async)はデッドロック(deadlock)の原因になることがあります。UIスレッドが.Resultや.Wait()で同期的に待つ間、非同期処理の継続はキャプチャしたUIコンテキストへ戻ろうとするが、UIスレッドは待ちで塞がっているため継続が実行できず、互いに待ち合うデッドロックになりうる。 / 確度: 確立した関係 / 確認日: 2026-08-01 出典
- .Result / .Wait() / .GetAwaiter().GetResult()はデッドロック(deadlock)の原因になることがあります。UIスレッドで.Result/.Wait()/.GetAwaiter().GetResult()を呼ぶと、呼び出した先のawaitが捕まえたUIコンテキストへ継続が戻れなくなる。必ずデッドロックするとは限らず、たまたま継続がUIに戻らないコードなら単にUIをフリーズさせるだけのこともある。 / 確度: 条件付きの関係 / 確認日: 2026-08-01 出典
- Dispatcher(WPF)はデッドロック(deadlock)の原因になることがあります。Dispatcher.InvokeAsyncが返すDispatcherOperationのTaskをUIスレッドからTask.Wait()すると、Dispatcherのキューを回すのは同じUIスレッドなので待ちで止まったままキューが進まず完了しない。DispatcherOperation.Wait()自身も、同じスレッドで実行中の操作を待つとInvalidOperationExceptionになると明記されている。 / 確度: 確立した関係 / 確認日: 2026-08-01 出典 出典
この概念を扱う記事
一次資料
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。