P1 kontynuuje działanie licznik = x1 2 2 1 P1 kończy wykonywanie na aktualizacji globalnego licznika P2 x2 = licznik 2 2 2 system operacyjny ustawia kontekst na P2, P2 wykonuje pierwszą instrukcję x2 = x2 + 1 2 2 3 P2 kontynuuje działanie licznik = x2 3 2 3 P2 kończy działanie i aktualizuje globalny licznik tym razem poprawną wartością

Sekcje krytyczne poziomu aplikacji Sekcje krytyczne poziomu aplikacji rezydują w zakresie pamięci procesu i są zwykle modyfikowalne przez sam proces. Nazywa się to obiektem przestrzeni użytkownika, ponieważ program uruchamiany przez użytkownika (w przeciwieństwie do jądra) może modyfikować obiekt i wchodzić z nim w interakcję. Jednakże wywołane funkcje mogą przeskoczyć do przestrzeni jądra aby zarejestrować w nim obiekt przestrzeni użytkownika.

Przykładowy kod sekcji krytycznych z wykorzystaniem POSIXowej biblioteki pthread

/* Przykład C/C++, Unix/Linux */ #include <pthread.h>

/* To jest obiekt sekcji krytycznej (statycznie zaalokowany) */ static pthread_mutex_t cs_mutex = PTHREAD_MUTEX_INITIALIZER;

void f() { /* Wejdź do sekcji krytycznej – inne wątki są zablokowane*/ pthread_mutex_lock( &cs_mutex );

/* Wykonaj trochę bezpiecznego przetwarzania*/

/*Opuść sekcję krytyczną – inne wątki mogą teraz pthread_mutex_lock() */ pthread_mutex_unlock( &cs_mutex ); }