C 同時プログラミングでは、1 つ以上のスレッドが他のスレッドのリソース解放を無期限に待機し、プログラムがハングする場合にデッドロックの問題が発生します。 std::lock_guard と std::unique_lock を使用してデッドロック検出を実装できます。デッドロックが発生すると、std::system_error 例外がスローされます。デッドロックを解決する方法には、ロックを順番に取得すること、時限ロックを使用すること、およびデッドロック回復アルゴリズムが含まれます。
デッドロックは、一般的なタイプの同時プログラミングです。このエラーは、 1 つ以上のスレッドが別のスレッドによってリソースが解放されるのを無期限に待機すると発生します。この状況により、プログラムが永久にハングアップします。
デッドロックを理解するには、次のシナリオを考えてください。
このとき、両方のスレッドが相手のリソース解放を待って待機状態になると、デッドロックが発生します。
C では、std::lock_guard
や std::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 サイトの他の関連記事を参照してください。