Cómo usar semáforos POSIX en lenguaje C

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 los sistemas Linux. Aprendamos cómo 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 deben ser atómicas y escribir código directamente conduciría a un cambio de contexto sin completar la función y resultaría en un desastre.

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

  1. Incluir semáforo.h
  2. Compile el código enlazando con -lpthread -lrt
  3. Para bloquear un semáforo o esperar podemos usar la función sem_wait :

    int sem_wait(sem_t *sem);

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

    int sem_post(sem_t *sem);

    Un semáforo se inicializa utilizando 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 o no entre procesos o entre 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.
  • value : 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 –

// C program to demonstrate working of Semaphores
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
  
sem_t mutex;
  
void* thread(void* arg)
{
    //wait
    sem_wait(&mutex);
    printf("\nEntered..\n");
  
    //critical section
    sleep(4);
      
    //signal
    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 hacerse con gcc ac -lpthread -lrt

Explicación:
se están creando 2 subprocesos, uno 2 segundos después del primero.
Pero el primer subproceso dormirá durante 4 segundos después de adquirir el bloqueo.
Por lo tanto, el segundo subproceso no entrará inmediatamente después de que se llame, entrará 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 le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@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 tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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