0Pricing
C Academy · Lezione

Sincronizzazione e condizioni di competizione

Implementi mutex e semafori per gestire in sicurezza le risorse condivise.

Sincronizzazione e condizioni di competizione è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 3 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 3 lezioni in totale.

Sincronizzazione e race condition

Sincronizzazione e race condition

Quando più thread accedono a risorse condivise, possono verificarsi race condition, che producono risultati imprevedibili.

In questa lezione imparerà:

  • Che cosa sono le race condition e come si verificano.
  • Come usare i mutex per prevenire le race condition.
  • Come i semafori aiutano a gestire le risorse condivise.
Sincronizzazione e condizioni di competizione — illustrazione 1

Che cos'è una race condition?

Che cos'è una race condition?

Una race condition si verifica quando più thread accedono contemporaneamente a dati condivisi, causando un comportamento imprevedibile.

Esempio:

  • Due thread tentano di aggiornare un contatore globale.
  • Il valore finale potrebbe essere errato a causa delle interferenze.

Esempio: race condition nel multithreading

Esempio: race condition nel multithreading

Questo programma mostra una race condition in cui più thread modificano una variabile condivisa.

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

Prevenzione delle race condition con un mutex

Prevenzione delle race condition con un mutex

Un mutex (mutua esclusione) garantisce che solo un thread alla volta acceda a una risorsa.

Funzioni dei mutex:

  • pthread_mutex_init() - Inizializza un mutex.
  • pthread_mutex_lock() - Blocca il mutex.
  • pthread_mutex_unlock() - Sblocca il mutex.
  • pthread_mutex_destroy() - Distrugge il mutex.

Esempio: uso di un mutex per prevenire le race condition

Esempio: uso di un mutex per prevenire le race condition

Questo programma risolve la race condition usando un mutex per controllare l'accesso al contatore condiviso.

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

Che cos'è un semaforo?

Che cos'è un semaforo?

Un semaforo è un contatore usato per controllare l'accesso alle risorse.

Funzioni principali:

  • sem_init() - Inizializza un semaforo.
  • sem_wait() - Diminuisce il valore del semaforo.
  • sem_post() - Aumenta il valore del semaforo.
  • sem_destroy() - Distrugge il semaforo.

Esempio: uso dei semafori per la sincronizzazione

Esempio: uso dei semafori per la sincronizzazione

Questo programma usa un semaforo per gestire l'accesso a una risorsa condivisa.

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

Best practice per la sincronizzazione dei thread

Best practice per la sincronizzazione dei thread

Per evitare le race condition:

  • Usi i mutex per proteggere le variabili condivise.
  • Usi i semafori per la gestione delle risorse.
  • Riduca al minimo l'uso di risorse condivise, quando possibile.

Riepilogo

Riepilogo

In questa lezione ha imparato:

  • Che cosa sono le race condition e come si verificano.
  • Come usare i mutex per prevenire le race condition.
  • Come i semafori aiutano a gestire l'accesso alle risorse condivise.

Con questo si conclude la sezione Multithreading e concorrenza in C.

Sincronizzazione e condizioni di competizione — illustrazione 10

Domande Frequenti

La lezione «Sincronizzazione e condizioni di competizione» è gratuita?

Sì — il testo completo di «Sincronizzazione e condizioni di competizione» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 3 lezioni in totale.

Cosa imparerò in «Sincronizzazione e condizioni di competizione»?

Implementi mutex e semafori per gestire in sicurezza le risorse condivise. Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 3.

Quanto tempo richiede la lezione «Sincronizzazione e condizioni di competizione»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Introduzione ai thread
  2. Creazione e gestione dei thread
  3. Sincronizzazione e condizioni di competizione
← Torna a C Academy