ホームページ  >  記事  >  バックエンド開発  >  C++ 同時プログラミング: デッドロックの問題を特定して解決するには?

C++ 同時プログラミング: デッドロックの問題を特定して解決するには?

WBOY
WBOYオリジナル
2024-05-04 17:54:021091ブラウズ

C 同時プログラミングでは、1 つ以上のスレッドが他のスレッドのリソース解放を無期限に待機し、プログラムがハングする場合にデッドロックの問題が発生します。 std::lock_guard と std::unique_lock を使用してデッドロック検出を実装できます。デッドロックが発生すると、std::system_error 例外がスローされます。デッドロックを解決する方法には、ロックを順番に取得すること、時限ロックを使用すること、およびデッドロック回復アルゴリズムが含まれます。

C++ 同時プログラミング: デッドロックの問題を特定して解決するには?

C 同時プログラミング: デッドロックの問題を特定して解決する方法

デッドロックについて

デッドロックは、一般的なタイプの同時プログラミングです。このエラーは、 1 つ以上のスレッドが別のスレッドによってリソースが解放されるのを無期限に待機すると発生します。この状況により、プログラムが永久にハングアップします。

デッドロックを理解するには、次のシナリオを考えてください。

  • スレッド A はリソース R1 を保持し、リソース R2 を取得しようとします。
  • スレッド B はリソース R2 を保持し、リソース R1 を取得しようとします。

このとき、両方のスレッドが相手のリソース解放を待って待機状態になると、デッドロックが発生します。

デッドロックの検出

C では、std::lock_guardstd::unique_lock などのロックを使用してリソースを保護できます。これらのロックはデッドロック検出メカニズムを実装しています。デッドロックが検出されると、std::system_error 例外がスローされます。

この例外をキャッチすることでデッドロックを検出できます:

std::mutex m1;
std::mutex m2;

void foo() {
  // 获取锁
  std::lock_guard<std::mutex> lock1(m1);
  std::lock_guard<std::mutex> lock2(m2);

  // 其他操作...
}
int main() {
  try {
    foo();
  } catch (const std::system_error& e) {
    std::cerr << "死锁检测到:异常代码 " << e.code() << std::endl;
  }
}

このプログラムの実行中にデッドロックが発生した場合、エラー メッセージが出力されます。

デッドロックの解決

デッドロックが検出されたら、それを解決する必要があります。一般的な解決策をいくつか示します。

  • 順番にロックを取得します。 デッドロックを防ぐことができます。
  • タイミング ロックを使用する: タイミング ロックは一定時間が経過するとタイムアウトになり、スレッドにリソースを強制的に解放します。
  • デッドロック回復アルゴリズム: バンカー アルゴリズムなどの特殊なアルゴリズムを使用すると、デッドロックを検出して回復できます。

実際的なケース

2 つのスレッド間で銀行口座オブジェクトを共有する次のコードを考えてみましょう。

class BankAccount {
public:
  int balance;
  std::mutex m;
};

void withdraw(BankAccount& account, int amount) {
  std::lock_guard<std::mutex> lock(account.m);
  if (account.balance >= amount)
    account.balance -= amount;
}

void deposit(BankAccount& account, int amount) {
  std::lock_guard<std::mutex> lock(account.m);
  account.balance += amount;
}

2 つのスレッドが同時に呼び出した場合 Withdraw 関数と deposit 関数を使用すると、デッドロックが発生する可能性があります。この問題は、次の順序でロックを取得することで解決できます。

以上がC++ 同時プログラミング: デッドロックの問題を特定して解決するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。