C#のマルチスレッド処理で発生するデッドロックとスタベーション(飢餓)とは
デッドロックとは
デッドロックとは、あるスレッドがリソースをロックしている状態で、別のスレッドが同時にそのリソースを必要としたときに発生する問題です。マルチプロセッシング環境では頻繁に見られる現象です。
また、2つ以上のスレッドが互いに相手のスレッドが保持するリソースを待ち続ける場合にも発生します。以下に典型的な例を示します。
| スレッド1 | スレッド2 |
|---|---|
| ロックPを取得 | ロックQを取得 |
| ロックQを要求 | ロックPを要求 |
この状況では、ロックQはスレッド2が所有しているため、スレッド1はロックQを取得できません。同様に、ロックPの元の所有者はスレッド1であるため、スレッド2もロックPを取得できません。その結果、両方のスレッドが互いの解放を永遠に待ち続けることになります。
さらに、デッドロックは3つのスレッドと3つのロックが絡み合う「三方向デッドロック」として発生することもあります。同じように、4方向、5方向など、より多くのスレッドとロックが関わるデッドロックも起こり得ます。
スタベーション(飢餓)とは
スタベーション(飢餓)とは、マルチスレッドアプリケーションにおいて、実行可能な状態にある1つ以上のスレッドが永久にブロックされ続ける現象を指します。優先度の高いスレッドがCPU時間を占有し続け、優先度の低いスレッドに実行の機会が与えられないことで発生します。
デッドロックを防ぐためのポイント
- 複数のロックを取得する場合は、すべてのスレッドで常に同じ順序で取得する
Monitor.TryEnterなどを活用し、ロック取得にタイムアウトを設定する- ロックの保持期間はできるだけ短くする
-
Windows 11/10でCaps Lock(キャップスロック)を無効にする2つの方法
Caps Lockキーは、有効になっている間すべての入力が大文字になるキーで、ユーザーからの評判は決して良くありません。実際、GoogleはChromebookからこのキーを廃止しました。Windows PCのキーボードからもCaps Lockはなくなってもいい、と考えるユーザーは少なくありません。その理由の一つは、Aキーのすぐ隣にあるため、タイピング中にうっかり押してしまいやすい点でしょう。もしCaps Lockをなくしたいのであれば、このキーを無効化することが可能です。無効にしてしまえば、タイピング中に誤ってCaps Lockが作動することは二度とありません。ここでは、Windows 11
-
macOSでファイルやフォルダをロックして保護する方法
Macの中には重要なデータが保存されていませんか?家族や同僚など、他の人がデバイスを使うことはありますか?あるいは、うっかり大切なファイルを変更・削除してしまうことが多い方でしょうか。いずれの場合でも、重要なファイルをロックしておけば、データ消失や後々の後悔を防ぐことができます。 macOSでは、「Finder」と「ターミナル」を使ってファイルやフォルダをロックし、最も重要なデータを保護できます。この記事では、ファイルのロック機能について詳しく解説し、それぞれの方法がどのように動作するのかを見ていきましょう。 macOSでファイルやフォルダをロックする理由 macOSでファイルやフォルダをロッ