Heim >Backend-Entwicklung >C++ >Wie verhindern Mutexe Race Conditions in der Multithread-Programmierung?

Wie verhindern Mutexe Race Conditions in der Multithread-Programmierung?

Linda Hamilton
Linda HamiltonOriginal
2024-11-11 15:18:02726Durchsuche

How do Mutexes Prevent Race Conditions in Multithreaded Programming?

Mutex-Konzepte: Ein vereinfachtes Tutorial

Mutexe, kurz für gegenseitige Ausschlusssperren, verhindern, dass mehrere Threads gleichzeitig auf gemeinsame Ressourcen zugreifen. Um zu verstehen, wie sie funktionieren, betrachten Sie eine Analogie:

Das Beispiel einer Telefonzelle

Stellen Sie sich eine einzelne Telefonzelle mit einem Türgriff vor. Die Leute (Threads) stehen Schlange, um das Telefon zu benutzen, aber nur die Person, die die Türklinke ergreift, kann es benutzen. In dem Moment, in dem sie loslassen, kann eine andere Person an die Reihe kommen.

In dieser Analogie:

  • Jede Person stellt einen Faden dar.
  • Der Türgriff repräsentiert den Mutex.
  • Das Halten des Türgriffs repräsentiert Sperren des Mutex.
  • Die Verwendung des Telefons bedeutet das Ausführen geschützten Codes.

Mutex-Logik

Ein Thread erhält durch Aufruf eine Sperre für einen Mutex pthread_mutex_lock(&mutex). Dies markiert einen Codebereich als exklusiv für diesen Thread.

Sobald der Thread mit der Ausführung dieses Codes fertig ist, gibt er die Sperre durch Aufruf von pthread_mutex_unlock(&mutex) frei. Dies signalisiert anderen Threads, dass sie nun die Sperre erwerben und den geschützten Code ausführen können.

Einfaches Mutex-Beispiel

Der folgende C 11-Code veranschaulicht das Mutex-Konzept:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex m;
int i = 0;

void makeACallFromPhoneBooth() {
    m.lock();  // Thread acquires lock on mutex (grabs door handle)
    std::cout << i << " Hello Wife" << std::endl;  // Protected code
    i++;  // No other thread can modify i while lock is held
    m.unlock();  // Thread releases lock (lets go of door handle)
}

int main() {
    std::thread man1(makeACallFromPhoneBooth);
    std::thread man2(makeACallFromPhoneBooth);
    std::thread man3(makeACallFromPhoneBooth);

    man1.join();
    man2.join();
    man3.join();
    return 0;
}

In diesem Beispiel versuchen drei Threads (Personen), eine gemeinsam genutzte Ressource (das Telefon) zu nutzen. Der Mutex stellt sicher, dass jeweils nur ein Thread auf die Ressource zugreifen kann.

Das obige ist der detaillierte Inhalt vonWie verhindern Mutexe Race Conditions in der 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