POSIX Threads/Synchronizacja między wątkami/Wirujące blokady

Wstęp

edytuj

Wirująca blokada (spinlock) jest rodzajem blokady, w której aktywnie oczekuje się na jej zwolnienie w przypadku, gdy nie może zostać pozyskana. Pod względem semantyki nie różnią się od mutexów, jednak zasadniczo różnią w implementacji i zakresie zastosowania.

Przede wszystkim spinlock zużywa czas procesora, więc jego stosowanie ma sens, gdy współdzielone zasoby nie są zbyt długo blokowane przez inne wątki. Ponadto na systemach wieloprocesorowych unika się kosztownego przełączania kontekstu.

Inicjalizacja i zwalnianie

edytuj
  • pthread_spinlock_t

Funkcje

edytuj
  • int pthread_spin_init(pthread_spinlock_t *lock, int pshared)  (doc)
inicjalizacja wirującej blokady; argument pshared przymuje wartości PTHREAD_PROCESS_PRIVATE lub PTHREAD_PROCESS_SHARED, jeśli dostępna jest opcja THS - patrz synchronizacja między wątkami różnych procesów
  • int pthread_spin_destroy(pthread_spinlock_t *lock)  (doc)
zniszczenie wirującej blokady

Pozyskiwanie blokady

edytuj

Funkcje

edytuj
  • int pthread_spin_lock(pthread_spinlock_t *lock)  (doc)
założenie blokady, jeśli nie jest to możliwe - oczekiwanie
  • int pthread_spin_trylock(pthread_spinlock_t *lock)  (doc)
założenie blokady, jeśli nie jest to możliwe - zwrócenie kodu błędu EBUSY

Zwalnianie blokady

edytuj

Funkcje

edytuj
  • int pthread_spin_unlock(pthread_spinlock_t *lock)  (doc)
zwolnienie blokady