Maison >développement back-end >C++ >Comment les mutex empêchent-ils les conditions de concurrence dans la programmation multithread ?

Comment les mutex empêchent-ils les conditions de concurrence dans la programmation multithread ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-11 15:18:02695parcourir

How do Mutexes Prevent Race Conditions in Multithreaded Programming?

Concepts mutex : un didacticiel simplifié

Les mutex, abréviation de verrous d'exclusion mutuelle, empêchent plusieurs threads d'accéder simultanément aux ressources partagées. Pour comprendre leur fonctionnement, envisagez une analogie :

L'exemple de cabine téléphonique

Imaginez une seule cabine téléphonique avec une poignée de porte. Les gens (fils) font la queue pour utiliser le téléphone, mais seule la personne qui saisit la poignée de porte peut l'utiliser. Au moment où ils lâchent prise, une autre personne peut prendre son tour.

Dans cette analogie :

  • Chaque personne représente un fil.
  • La poignée de porte représente le mutex.
  • Tenir la poignée de porte représente verrouiller le mutex.
  • Utiliser le téléphone représente exécuter du code protégé.

Mutex Logic

Un thread acquiert un verrou sur un mutex en appelant pthread_mutex_lock(&mutex). Cela marque une région de code comme exclusive à ce thread.

Une fois que le thread a fini d'exécuter ce code, il libère le verrou en appelant pthread_mutex_unlock(&mutex). Cela signale aux autres threads qu'ils peuvent désormais acquérir le verrou et exécuter le code protégé.

Exemple de mutex simple

Le code C 11 suivant illustre le concept de mutex :

#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;
}

Dans cet exemple, trois threads (personnes) tentent d'utiliser une ressource partagée (le téléphone). Le mutex garantit qu'un seul thread peut accéder à la ressource à la fois.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn