in

Cómo usar semáforos POSIX en lenguaje C

gfg 200x200 min

Los semáforos son muy útiles en la sincronización de procesos y subprocesos múltiples. Pero, ¿cómo usar uno en la vida real, por ejemplo, en lenguaje C?

Bueno, tenemos la biblioteca de semáforos POSIX en sistemas Linux. Aprendamos a usarlo.

El código básico de un semáforo es simple como se presenta aquí. Pero este código no se puede escribir directamente, ya que las funciones requieren ser atómicas y escribir código directamente conduciría a un cambio de contexto sin la finalización de la función y resultaría en un desorden.

El sistema POSIX en Linux presenta su propia biblioteca de semáforos incorporada. Para usarlo, tenemos que:

  1. Incluir semaphore.h
  2. Compile el código vinculándolo con -lpthread -lrt

    Para bloquear un semáforo o esperar podemos usar el sem_wait función:

    int sem_wait(sem_t *sem);

    Para lanzar o señalar un semáforo, usamos el sem_post función:

    int sem_post(sem_t *sem);

    Un semáforo se inicializa usando sem_init(para procesos o subprocesos) o sem_open (para IPC).

    sem_init(sem_t *sem, int pshared, unsigned int value);

    Dónde,

    • sem : Especifica el semáforo que se inicializará.
    • pshared : Este argumento especifica si el semáforo recién inicializado se comparte entre procesos o subprocesos. Un valor distinto de cero significa que el semáforo se comparte entre procesos y un valor de cero significa que se comparte entre subprocesos.
    • valor : Especifica el valor que se asignará al semáforo recién inicializado.

    Para destruir un semáforo, podemos usar sem_destroy.

    sem_destroy(sem_t *mutex);

    Para declarar un semáforo, el tipo de datos es sem_t.

    Código –

    #include <stdio.h>

    #include <pthread.h>

    #include <semaphore.h>

    #include <unistd.h>

     

    sem_t mutex;

     

    void* thread(void* arg)

    {

        

        sem_wait(&mutex);

        printf("nEntered..n");

     

        

        sleep(4);

         

        

        printf("nJust Exiting...n");

        sem_post(&mutex);

    }

     

     

    int main()

    {

        sem_init(&mutex, 0, 1);

        pthread_t t1,t2;

        pthread_create(&t1,NULL,thread,NULL);

        sleep(2);

        pthread_create(&t2,NULL,thread,NULL);

        pthread_join(t1,NULL);

        pthread_join(t2,NULL);

        sem_destroy(&mutex);

        return 0;

    }

    La compilación debe realizarse con gcc ac -lpthread -lrt

    Explicación –
    Se están creando 2 hilos, uno 2 segundos después del primero.
    Pero el primer hilo dormirá durante 4 segundos después de adquirir el bloqueo.
    Por lo tanto, el segundo hilo no ingresará inmediatamente después de que se llame, ingresará 4 – 2 = 2 segundos después de que se llame.
    Entonces la salida es:

    Entered..
    
    Just Exiting...
    
    Entered..
    
    Just Exiting...
    
    

    pero no:

    Entered..
    
    Entered..
    
    Just Exiting...
    
    Just Exiting...
    

    Este artículo es una contribución de Suprotik Dey. Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando contrib.geeksforgeeks.org o envíe su artículo por correo electrónico a contrib@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

    Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema discutido anteriormente.

    Si desea aprender de los mejores videos seleccionados y problemas de práctica, consulte el Curso básico de C de Básico a Avanzado C.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

apple touch icon@2

sql – ¿Cuál es la diferencia entre «INNER JOIN» y «OUTER JOIN»?

220px Advil and Tylenol

Aleve vs Advil: diferencia y comparación