C Academy · Lekcja

Synchronizacja i sytuacje wyścigu

Proszę implementować mutexy i semafory do bezpiecznego zarządzania współdzielonymi zasobami.

Lekcja 3 z 310 kroki

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.
Synchronizacja i sytuacje wyścigu — ilustracja 1

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!

Synchronizacja i sytuacje wyścigu — ilustracja 10
Bezpłatny start

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

  1. Wprowadzenie do wątków
  2. Tworzenie wątków i zarządzanie nimi
  3. Synchronizacja i sytuacje wyścigu
← Powrót do C Academy