C Academy · Leçon

Synchronisation et conditions de concurrence

Mettez en œuvre des mutex et des sémaphores pour gérer les ressources partagées en toute sécurité.

Leçon 3 sur 310 étapes

Synchronisation et conditions de concurrence est une leçon C Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 3. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage C Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours C Academy comprend 3 leçons au total.

Synchronisation et conditions de concurrence

Lorsque plusieurs fils d’exécution accèdent à des ressources partagées, des conditions de concurrence peuvent survenir et entraîner des résultats imprévisibles.

Dans cette leçon, vous apprendrez :

  • Ce que sont les conditions de concurrence et comment elles surviennent.
  • Comment utiliser des mutex pour empêcher les conditions de concurrence.
  • Comment les sémaphores aident à gérer les ressources partagées.
Synchronisation et conditions de concurrence — illustration 1

Qu’est-ce qu’une condition de concurrence ?

Une condition de concurrence survient lorsque plusieurs fils d’exécution accèdent simultanément à des données partagées, ce qui entraîne un comportement imprévisible.

Exemple :

  • Deux fils d’exécution tentent de mettre à jour un compteur global.
  • La valeur finale peut être incorrecte en raison des interférences.

Exemple : condition de concurrence en multithreading

Ce programme montre une condition de concurrence dans laquelle plusieurs fils d’exécution modifient une variable partagée.

#include <stdio.h>
#include <pthread.h>

int counter = 0;

void *incrementCounter(void *arg) {
    for (int i = 0; i < 1000000; i++) {
        counter++;
    }
    return NULL;
}

int main() {
    pthread_t t1, t2;
    pthread_create(&t1, NULL, incrementCounter, NULL);
    pthread_create(&t2, NULL, incrementCounter, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    printf("Final counter value: %d\n", counter);
    return 0;
}

Empêcher les conditions de concurrence avec un mutex

Un mutex (exclusion mutuelle) garantit qu’un seul fil d’exécution accède à une ressource à la fois.

Fonctions de mutex :

  • pthread_mutex_init() - Initialise un mutex.
  • pthread_mutex_lock() - Verrouille le mutex.
  • pthread_mutex_unlock() - Déverrouille le mutex.
  • pthread_mutex_destroy() - Détruit le mutex.

Exemple : utiliser un mutex pour empêcher les conditions de concurrence

Ce programme corrige la condition de concurrence en utilisant un mutex pour contrôler l’accès au compteur partagé.

#include <stdio.h>
#include <pthread.h>

int counter = 0;
pthread_mutex_t lock;

void *incrementCounter(void *arg) {
    for (int i = 0; i < 1000000; i++) {
        pthread_mutex_lock(&lock);
        counter++;
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}

int main() {
    pthread_t t1, t2;
    pthread_mutex_init(&lock, NULL);
    pthread_create(&t1, NULL, incrementCounter, NULL);
    pthread_create(&t2, NULL, incrementCounter, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    pthread_mutex_destroy(&lock);
    printf("Final counter value: %d\n", counter);
    return 0;
}

Qu’est-ce qu’un sémaphore ?

Un sémaphore est un compteur utilisé pour contrôler l’accès aux ressources.

Fonctions principales :

  • sem_init() - Initialise un sémaphore.
  • sem_wait() - Diminue la valeur du sémaphore.
  • sem_post() - Augmente la valeur du sémaphore.
  • sem_destroy() - Détruit le sémaphore.

Exemple : utiliser des sémaphores pour la synchronisation

Ce programme utilise un sémaphore pour gérer l’accès à une ressource partagée.

#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>

sem_t sem;

void *task(void *arg) {
    sem_wait(&sem);
    printf("Thread %d is executing\n", *(int *)arg);
    sem_post(&sem);
    return NULL;
}

int main() {
    pthread_t t1, t2;
    int id1 = 1, id2 = 2;
    sem_init(&sem, 0, 1);
    pthread_create(&t1, NULL, task, &id1);
    pthread_create(&t2, NULL, task, &id2);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    sem_destroy(&sem);
    return 0;
}

Bonnes pratiques pour synchroniser les fils d’exécution

Pour éviter les conditions de concurrence :

  • Utilisez des mutex pour protéger les variables partagées.
  • Utilisez des sémaphores pour gérer les ressources.
  • Réduisez autant que possible l’utilisation des ressources partagées.

Résumé

Dans cette leçon, vous avez appris :

  • Ce que sont les conditions de concurrence et comment elles surviennent.
  • Comment utiliser des mutex pour empêcher les conditions de concurrence.
  • Comment les sémaphores aident à gérer l’accès aux ressources partagées.

Cette leçon conclut la section consacrée au multithreading et à la concurrence en C !

Synchronisation et conditions de concurrence — illustration 10
Gratuit pour commencer

Apprends C avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
39
Leçons
144

Questions Fréquemment Posées

La leçon « Synchronisation et conditions de concurrence » est-elle gratuite ?

Oui — le texte complet de « Synchronisation et conditions de concurrence » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours C Academy, passe à CoddyKit PRO. Le cours C Academy comprend 3 leçons au total.

Qu'est-ce que j'apprendrai dans « Synchronisation et conditions de concurrence » ?

Mettez en œuvre des mutex et des sémaphores pour gérer les ressources partagées en toute sécurité. Tu pratiques C Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer C Academy ?

Aucune expérience préalable n'est requise. C Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 3.

Combien de temps prend la leçon « Synchronisation et conditions de concurrence » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon C Academy ?

Oui. Chaque leçon C Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Introduction aux threads
  2. Création et gestion des threads
  3. Synchronisation et conditions de concurrence
← Retour à C Academy