Synchronizacja i sytuacje wyścigu
Proszę implementować mutexy i semafory do bezpiecznego zarządzania współdzielonymi zasobami.
Synchronizacja i sytuacje wyścigu to bezpłatna lekcja C Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C Academy zawiera 3 lekcji w sumie.
Synchronizacja i warunki wyścigu
Gdy wiele wątków korzysta ze współdzielonych zasobów, mogą wystąpić warunki wyścigu prowadzące do nieprzewidywalnych rezultatów.
W tej lekcji dowiedzą się Państwo:
- Czym są warunki wyścigu i jak powstają.
- Jak używać muteksów, aby zapobiegać warunkom wyścigu.
- Jak semafory pomagają zarządzać współdzielonymi zasobami.

Czym jest warunek wyścigu?
Warunek wyścigu występuje, gdy wiele wątków jednocześnie uzyskuje dostęp do współdzielonych danych, co prowadzi do nieprzewidywalnego działania programu.
Przykład:
- Dwa wątki próbują zaktualizować globalny licznik.
- Wartość końcowa może być nieprawidłowa z powodu wzajemnego zakłócania się wątków.
Przykład: warunek wyścigu w programowaniu wielowątkowym
Ten program pokazuje warunek wyścigu, w którym wiele wątków modyfikuje współdzieloną zmienną.
#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;
}Zapobieganie warunkom wyścigu za pomocą muteksu
Muteks (mechanizm wzajemnego wykluczania) gwarantuje, że w danym momencie tylko jeden wątek uzyskuje dostęp do zasobu.
Funkcje muteksów:
pthread_mutex_init()- Inicjalizuje muteks.pthread_mutex_lock()- Blokuje muteks.pthread_mutex_unlock()- Odblokowuje muteks.pthread_mutex_destroy()- Niszczy muteks.
Przykład: użycie muteksu do zapobiegania warunkom wyścigu
Ten program eliminuje warunek wyścigu, używając muteksu do kontrolowania dostępu do współdzielonego licznika.
#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;
}Czym jest semafor?
Semafor to licznik używany do kontrolowania dostępu do zasobów.
Najważniejsze funkcje:
sem_init()- Inicjalizuje semafor.sem_wait()- Zmniejsza wartość semafora.sem_post()- Zwiększa wartość semafora.sem_destroy()- Niszczy semafor.
Przykład: użycie semaforów do synchronizacji
Ten program używa semafora do zarządzania dostępem do współdzielonego zasobu.
#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;
}Najlepsze praktyki synchronizacji wątków
Aby uniknąć warunków wyścigu:
- Używaj muteksów do ochrony współdzielonych zmiennych.
- Używaj semaforów do zarządzania zasobami.
- W miarę możliwości ograniczaj korzystanie ze współdzielonych zasobów.
Podsumowanie
W tej lekcji poznali Państwo:
- Czym są warunki wyścigu i jak powstają.
- Jak używać muteksów, aby zapobiegać warunkom wyścigu.
- Jak semafory pomagają zarządzać dostępem do współdzielonych zasobów.
To kończy sekcję dotyczącą wielowątkowości i współbieżności w języku C!

Ucz się C dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 39
- Lekcje
- 144
Często zadawane pytania
Czy lekcja „Synchronizacja i sytuacje wyścigu” jest bezpłatna?
Tak — pełny tekst „Synchronizacja i sytuacje wyścigu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C Academy, przejdź na CoddyKit PRO. Kurs C Academy zawiera 3 lekcji w sumie.
Co nauczysz się w „Synchronizacja i sytuacje wyścigu”?
Proszę implementować mutexy i semafory do bezpiecznego zarządzania współdzielonymi zasobami. Ćwiczysz C Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć C Academy?
Nie wymagamy żadnego doświadczenia. C Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.
Ile czasu zajmuje lekcja „Synchronizacja i sytuacje wyścigu”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji C Academy?
Tak. Każda lekcja C Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wprowadzenie do wątków
- Tworzenie wątków i zarządzanie nimi
- Synchronizacja i sytuacje wyścigu