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

CBeginner
Pratiquer maintenant

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

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.

Résumé

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

✨ Vérifier la solution et pratiquer✨ Vérifier la solution et pratiquer