Heim  >  Artikel  >  Backend-Entwicklung  >  Was sind die Ursachen für Deadlocks in der C++-Multithread-Programmierung?

Was sind die Ursachen für Deadlocks in der C++-Multithread-Programmierung?

WBOY
WBOYOriginal
2024-06-03 10:05:58930Durchsuche

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.

C++ 多线程编程中 deadlocks 的成因是什么?

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:

  • Unsachgemäße Verwendung von Mutex-Sperren: Wenn Mutex-Sperren nicht korrekt verwendet werden, versuchen Threads möglicherweise, gleichzeitig dieselbe Sperre zu erhalten, was zu einem Deadlock führt.
  • Sequentielle Sperre: Wenn Threads mehrere Sperren erwerben müssen, sollten sie diese Sperren immer in derselben Reihenfolge erwerben. Andernfalls kann es zu einem Deadlock kommen, da ein Thread möglicherweise darauf wartet, dass ein anderer Thread eine Sperre aufhebt, und ein anderer Thread darauf wartet, dass dieser Thread eine weitere Sperre aufhebt.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn