Semafory

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 ;

W tym przykładzie, semafory sem1 i sem2 są używane do synchronizacji wątków 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).

Źródło : Systemy Czasu rzeczywistego QNX6 Neutrino Jędrzej Ułasiewicz

Polecam zapoznać się z artykułem:

https://pl.linuxteaching.com/article/how_semaphore_works#how_do_you_create_a_semaphore

Dodaj komentarz