Semafory to struktury danych, które mogą być używane przez wiele procesów do komunikacji
(synchronizacji). Semafor przyjmuje wartości całkowite, nieujemne. Mechanizm ten odpowiada za synchronizacje procesów i wątków, które służą do zarządzania dostępem do współdzielonych zasobów. Są one używane do określenia, czy dany zasób jest wolny czy zajęty i do synchronizacji dostępu do tego zasobu pomiędzy różnymi procesami lub wątkami.

Program obrazujący działanie Semaforów został zrealizowany przy użyciu Systemu QNX przez środowisko programistyczne QNX Momentics IDE
Przykład
#include <semaphore.h>
#include <pthread.h>
#include <stdio.h>
sem_t sem1;
sem_t sem2;
void *function1(void *arg)
{
// Wątek 1 używa semafora sem1 do synchronizacji
sem_wait(&sem1);
printf("Function 1\n");
sem_post(&sem2);
return NULL;
}
void *function2(void *arg)
{
// Wątek 2 używa semafora sem2 do synchronizacji
sem_wait(&sem2);
printf("Function 2\n");
sem_post(&sem1);
return NULL;
}
int main()
{
pthread_t thread1, thread2;
// Inicjalizujemy semafory
sem_init(&sem1, 0, 0);
sem_init(&sem2, 0, 1);
// Tworzymy wątki
pthread_create(&thread1, NULL, function1, NULL);
pthread_create(&thread2, NULL, function2, NULL);
// Oczekujemy na zakończenie wątków
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
return 0;
}
Wyjście ;

function1 i function2. Wątek 1 używa semafora sem1 do synchronizacji, a wątek 2 używa semafora sem2 do synchronizacji. Dzięki temu możemy zagwarantować, że funkcje te będą wykonywane w odpowiedniej kolejności.Wątek1 jest powiązany z semaforem sem1, co oznacza, że wątek1 będzie w stanie wykonać swoją funkcję tylko wtedy, gdy semafor sem1 pozwoli na to. Natomiast wątek2 jest powiązany z semaforem sem2, co oznacza, że będzie w stanie wykonać swoją funkcję tylko wtedy, gdy semafor sem2 pozwoli na to. W takim przypadku, jeśli funkcja wątku1 jest blokowana przez semafor sem1, wątek2 będzie mógł wykonać swoją funkcję, jeśli tylko semafor sem2 pozwoli na to. W ten sposób można zapewnić, że funkcje te będą wykonywane w odpowiedniej kolejności.
Składania:
int sem_init(sem_t *sem, int pshared, unsigned int value);
- sem: wskaźnik na semafor
- pshared: informuje czy semafor jest dostępny dla wszystkich procesów czy tylko dla wątków w jednym procesie. Jeśli jest ustawione na 0, semafor jest dostępny tylko dla wątków w jednym procesie, a jeśli jest ustawione na 1, semafor jest dostępny dla wszystkich procesów.
- value: początkowa wartość semafora. W naszym przypadku semafor sem1 jest inicjalizowany z wartością 0, co oznacza, że jest blokowany, a semafor sem2 jest inicjalizowany z wartością 1, co oznacza, że jest odblokowany.
Więc w naszym przykładzie semafor sem1 jest inicjalizowany jako blokowany (wartość 0), a semafor sem2 jest inicjalizowany jako odblokowany (wartość 1).

Polecam zapoznać się z artykułem: