リソース不足がライブロックの特殊なケースだとは言いません。いつもの:
良い説明: http://docs.oracle.com/javase/tutorial/essential/concurrency/starvelive.html。しかし、用語の選択が異なる場合があることは理解しています。
飢餓に関しては、私が聞いた定義は次のとおりです。
仮定 (セマフォのセマンティクス、OS スケジューラの動作など) と一致する無限の実行パス (インターレース) を指定できると仮定して、スレッド T が何らかのリソースを待機して中断され、再開されることはありません。 . このとき、T は飢餓と呼ばれます。
しかし、練習はそれに一致しません。2 つのスレッドが無限ループで同じクリティカル セクションを実行するとします。同期コードにより、最初のスレッドは 1 時間に 1 回クリティカル セクションに入ることができます。飢餓ですか?両方のスレッドの進行が許可されていますが、最初のスレッドはその作業を非常にゆっくりと行っています。
飢餓の最も単純な原因は弱いセマフォです。同様に動作する同期プリミティブを使用している (または独自に構築している) 場合、飢餓が発生します。
飢餓がよく知られている古典的な問題:
詳細については、The Little Book of Semaphores (無料): http://www.greenteapress.com/semaphores/を心からお勧めします。
すべての飢餓が何らかのリソースを待っているために引き起こされているかどうかを尋ねています。そうです。
スレッドは中断できます。
(1) ブロッキング システム コールで - ミューテックス、セマフォ、条件変数の待機/取得。write()、poll() など。
(2) いくつかのノンブロッキング操作 - 計算の実行など。
(1) の飢餓は、リソース (ミューテックス、バッファなど) の飢餓です。
(2) の飢餓は、CPU の飢餓です。これはリソースと見なすことができます。発生する場合、問題はスケジューラにあります。
HTH