Heim > Artikel > Backend-Entwicklung > Was sind die Ursachen für Deadlocks in der C++-Multithread-Programmierung?
Bei der C++-Multithread-Programmierung sind die Hauptursachen für Deadlocks: 1. Unsachgemäße Verwendung von Mutex-Sperren; 2. Sequentielles Sperren. Wenn im tatsächlichen Kampf mehrere Threads versuchen, denselben Sperrsatz gleichzeitig und in unterschiedlicher Reihenfolge zu erwerben, kann es zu einem Deadlock kommen. Dies kann vermieden werden, indem Schlösser immer in der gleichen Reihenfolge erworben werden.
Ursachen für Deadlocks in der C++-Multithread-Programmierung
Deadlock ist ein häufiger Fehler bei der gleichzeitigen Programmierung. Er tritt auf, wenn ein oder mehrere Threads darauf warten, dass ein anderer Thread eine Sperre aufhebt, während ein anderer Thread darauf wartet, dass der erstere die Sperre aufhebt Lösen Sie die Sperre wieder. Dadurch bleibt das Programm hängen und kann die Ausführung nicht fortsetzen.
In C++ werden Deadlocks normalerweise verursacht durch:
Praktisches Beispiel:
Betrachten Sie den folgenden Code:
class BankAccount { public: std::mutex m_mutex; // 互斥锁 int balance = 0; }; void transfer(BankAccount &from, BankAccount &to, int amount) { std::lock_guard<std::mutex> lock1(from.m_mutex); // 锁定第一个账户 std::lock_guard<std::mutex> lock2(to.m_mutex); // 锁定第二个账户 // 从第一个账户扣除金额 from.balance -= amount; // 将金额添加到第二个账户 to.balance += amount; }
Wenn in diesem Beispiel zwei Threads gleichzeitig die transfer()
-Funktion aufrufen und versuchen, Geld von verschiedenen Konten auf dasselbe Konto zu überweisen, kommt es zu einem Todesfall wird auftreten Sperre. Dies liegt daran, dass ein Thread zuerst das erste Konto sperrt und dann darauf wartet, dass ein anderer Thread das zweite Konto freigibt, und der andere Thread zuerst das zweite Konto sperrt und dann darauf wartet, dass der erste Thread das erste Konto freigibt.
Um dies zu vermeiden, sollten Threads Sperren immer in derselben Reihenfolge erhalten, zum Beispiel:
void transfer(BankAccount &from, BankAccount &to, int amount) { // 按照账户 ID 排序账户 if (from.getId() < to.getId()) { std::lock_guard<std::mutex> lock1(from.m_mutex); std::lock_guard<std::mutex> lock2(to.m_mutex); } else { std::lock_guard<std::mutex> lock2(to.m_mutex); std::lock_guard<std::mutex> lock1(from.m_mutex); } // 从第一个账户扣除金额 from.balance -= amount; // 将金额添加到第二个账户 to.balance += amount; }
Indem wir Konten nach Konto-ID sortieren und sie in derselben Reihenfolge sperren, können wir dies verhindern.
Das obige ist der detaillierte Inhalt vonWas sind die Ursachen für Deadlocks in der C++-Multithread-Programmierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!