Synchroniser l'impression multi-fil avec un verrou (mutex)

CCBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce projet, vous allez apprendre à utiliser un verrou (mutex) pour synchroniser l'impression de chaînes de caractères dans un environnement multi-fil. Vous allez modifier un programme existant de "Typewriter chaotique" pour vous assurer que les chaînes de caractères sont imprimées dans l'ordre correct, sans aucun mélange d'éléments.

👀 Aperçu

$ gcc printer.c -o printer -lpthread
$./printer
helloworld

🎯 Tâches

Dans ce projet, vous allez apprendre :

  • Comment initialiser un verrou dans la fonction init()
  • Comment verrouiller et déverrouiller le verrou dans la fonction printer() pour vous assurer un accès exclusif au processus d'impression
  • Comment compiler et exécuter le programme modifié pour observer la sortie correcte

🏆 Réalisations

Après avoir terminé ce projet, vous serez capable de :

  • Comprendre l'importance du verrou dans la synchronisation de l'accès à des ressources partagées dans un programme multi-fil
  • Appliquer les techniques de verrouillage et de déverrouillage du verrou pour coordonner l'exécution de plusieurs fils
  • Dépanner et corriger les problèmes dans un programme multi-fil pour obtenir la sortie souhaitée

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/PointersandMemoryGroup(["Pointers and Memory"]) c(("C")) -.-> c/FunctionsGroup(["Functions"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/CompoundTypesGroup -.-> c/strings("Strings") c/PointersandMemoryGroup -.-> c/memory_address("Memory Address") c/FunctionsGroup -.-> c/function_declaration("Function Declaration") c/FunctionsGroup -.-> c/function_parameters("Function Parameters") c/UserInteractionGroup -.-> c/output("Output") subgraph Lab Skills c/strings -.-> lab-301495{{"Synchroniser l'impression multi-fil avec un verrou (mutex)"}} c/memory_address -.-> lab-301495{{"Synchroniser l'impression multi-fil avec un verrou (mutex)"}} c/function_declaration -.-> lab-301495{{"Synchroniser l'impression multi-fil avec un verrou (mutex)"}} c/function_parameters -.-> lab-301495{{"Synchroniser l'impression multi-fil avec un verrou (mutex)"}} c/output -.-> lab-301495{{"Synchroniser l'impression multi-fil avec un verrou (mutex)"}} end

Initialiser le verrou (mutex)

Dans cette étape, vous allez apprendre à initialiser le verrou dans la fonction init(). Suivez les étapes ci-dessous pour compléter cette étape :

  1. Ouvrez le fichier printer.c situé dans le répertoire /home/labex/project/.
  2. Dans le code déjà fourni pour la fonction printer, le verrou est verrouillé (pthread_mutex_lock(&mutex)) au début pour vous assurer un accès exclusif au processus d'impression. Une fois que la chaîne de caractères est entièrement imprimée, le verrou est déverrouillé (pthread_mutex_unlock(&mutex)), permettant à l'autre fil d'imprimer.
  3. Localisez la fonction init() et ajoutez le code suivant pour initialiser le verrou :
void init()
{
    pthread_mutex_init(&mutex, NULL);
}

Cela initialise la variable mutex à l'aide de la fonction pthread_mutex_init(), qui est partie de la bibliothèque POSIX Threads (pthreads). Le second argument NULL spécifie que nous utilisons les attributs de verrou par défaut.

Compiler et exécuter le programme

Maintenant que vous avez terminé les modifications du fichier printer.c, vous pouvez compiler et exécuter le programme.

  1. Ouvrez un terminal et accédez au répertoire /home/labex/project/.
  2. Compilez le programme avec l'option -lpthread pour lier la bibliothèque pthreads :
gcc printer.c -o printer -lpthread
  1. Exécutez le programme :
./printer

Vous devriez maintenant voir la sortie :

helloworld

Les chaînes de caractères "hello" et "world" sont imprimées dans l'ordre, sans aucun mélange des lettres, comme prévu.

Félicitations ! Vous avez réussi à modifier le programme "Typewriter chaotique" pour qu'il fonctionne comme prévu.

✨ Vérifier la solution et pratiquer

Sommaire

Félicitations ! Vous avez terminé ce projet. Vous pouvez pratiquer plus de laboratoires sur LabEx pour améliorer vos compétences.