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.

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.

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
- Introduzione ai thread
- Creazione e gestione dei thread
- Sincronizzazione e condizioni di competizione