Uso de la función c sem_init

Uso de la función c sem_init
La función sem_init () funciona para inicializar un semáforo no identificado. Ahora aquí surge la pregunta: ¿Qué es un semáforo?? Semaphore es un concepto que trata con un proceso o sincronización de hilos. Un semáforo es una estructura de datos utilizada para sincronizar el proceso y ayudar a los hilos sin interactuar con los otros hilos para continuar su funcionamiento juntos. El tipo de semáforo que admite Linux es el Posix Semaphore. POSIX se utiliza como una interfaz portátil del sistema operativo. C Posix tiene una biblioteca de paquetes construida con estándar C. Posix agrega algunas características adicionales a los programas utilizados en los estándares C.

¿Por qué se usan los semáforos??

Mientras usamos hilos, encontramos varios problemas condicionales que involucran condiciones de carrera. Esto ocurre cuando dos o más hilos necesitan los mismos datos o información al mismo tiempo que causa conflicto. Entonces, para evitar este tipo de situación conflictiva, usamos semáforos. Hay tres tipos principales de semáforos. Uno es un semáforo binario, y otro es un semáforo de conteo.

Utilizamos diferentes funciones en el rango de semáforo como SEM_WAIT, SEM_POST y SEM_INIT. SEM_INIT es el tema en consideración en este artículo.

Sem_init

Como discutimos anteriormente, para inicializar el semáforo en los hilos, usamos la función SEM_INIT. Aquí usamos una bandera o un banner que identifica el intercambio de semáforo con el procedimiento de horquilla ().

Sintaxis

# sem_init (sem *sem, int pshared, int value (sin firmado));

Sem: Esta característica ayuda al semáforo a estar en un estado listo.

Pshared: Este argumento de parámetros es fundamental en la declaración de semáforo. Como determina el estado del semáforo recién inicializado. Si debe compartirse o no entre los procesos o hilos. Si el valor no es cero, significa que el semáforo se comparte entre dos o más procesos, y si el valor es cero, entonces significa que el semáforo se comparte entre los hilos.

Valor: Especifica el valor que se asignará al semáforo recién creado que se asigna inicialmente.

Implementación de SEM_INIT

Para ejecutar semáforos en el programa C, necesitamos un compilador GCC. Pero esto no es suficiente. "-LpThread" se usa para ejecutar el código. 'a.C 'es el nombre del archivo. Otra cosa es que aquí usamos '.out 'con el nombre del archivo en lugar de usar el archivo de forma independiente.

Ejemplo 1

Primero, agregamos dos bibliotecas que tienen semáforos y pthread para consentir el uso de paquetes C. Al igual que SEM_INIT, se utilizan otros semáforos en este programa; Aquí, los discutiremos.

Sem_wait ()

Esta función se usa para mantener un semáforo o para seguir esperando. Si el valor proporcionado al semáforo es negativo, la llamada está bloqueada y el ciclo está cerrado. Mientras que cualquier otro hilo, cuando se llama, se despiertan los semáforos bloqueados.

Sem_post ()

El método SEM_POST se usa para aumentar el valor de semáforo. El valor se incrementa por SEM_POST cuando se llama.

Sem_destroy ()

Si queremos destruir Semaphore, usamos el método SEM_DestrOY. Ahora, nuevamente, concéntrese en el código fuente proporcionado aquí. Primero, la función "espera" se usa aquí. Hará que el hilo espere primero para que otros puedan realizar una tarea. Se muestra un mensaje que el hilo se ingresa al llamar a la función. Después de eso, se requiere una función de "sueño" durante 5 segundos.

Se crean dos hilos de acuerdo con las funciones principales, se crean 2 hilos, pero el primero duerme durante 5 segundos después de que se adquiere el bloqueo. Entonces el segundo hilo no se ingresa cuando se llama. Entrará después de 5-2 segundos cuando se llama.

SEM_POST funcionará después de la función de sueño; SEM_POST funcionará y mostrará un mensaje de estado completo. En el programa principal, el semáforo se inicializa primero, y luego ambos hilos se crean utilizando pThread. Usamos la función pthread_Join para unir los hilos. Y al final, los semáforos son destruidos.

Guarde el archivo con la extensión de .C; El código se compilará y se realizará la ejecución. En la ejecución, verá que se muestra el primer mensaje, y luego tarda unos segundos en completarse, ya que hemos proporcionado a la función de sueño 5 segundos, por lo que después de ese tiempo, se muestra el segundo mensaje para el primer hilo.

Con frecuencia se muestra el primer mensaje para el segundo hilo.

El segundo mensaje volverá a tomar el tiempo para continuar.

Ejemplo 2

Antes de avanzar hacia el segundo ejemplo, primero, necesitamos comprender el concepto del problema del escritor del lector. Supongamos que una base de datos que desea compartir entre los procesos se ejecuta simultáneamente. Algunos de estos procesos o hilos solo pueden leer la base de datos. Al mismo tiempo, a otros les gustaría modificar la base de datos. Discriminamos entre estos dos declarando el primero como lector y el segundo como escritor. Si dos lectores acceden a los datos compartidos, no causará ningún efecto.

Para minimizar la ocurrencia de este tipo de dificultades, necesitamos ayudar a los escritores a acceder a la base de datos compartida para escribir en ella. Este problema está sincronizado y conocido como el problema de los lectores-escritores.

Hay muchas variaciones en este problema. El primero se ocupa del problema que ningún lector esperará a menos que un escritor use objetos compartidos.

Este programa proporciona la solución para el primer problema del lector-escritor. En este código fuente C, utilizamos 10 lectores y 5 procedimientos para demostrar la solución. Se toman los dos primeros contadores que se denominan cero. El no lector identifica el número del lector. Avanzando hacia la función del escritor, se usan dos funciones semáforas aquí, la primera es la espera, y la última es la publicación. Esto mostrará el número del escritor.

Después de la función del escritor, la función del lector se declara aquí. El escritor modificará la base de datos para que el lector no pueda ingresar o cambiar nada adquirido por un bloqueo.

# Pthread_mutex_lock (& ​​mutex);

El recuento no lector se incrementa entonces. Aquí se aplica un cheque de if-statement. Si el valor es 1, significa que es el primer lector para que el escritor sea bloqueado. Si el no lector es 0, después de verificar, significa que es el último lector, por lo que ahora permitiremos al escritor la modificación.

# Pthread_mutex_unlock (& ​​mutex);

Avanzaremos hacia el programa principal después de la función del lector y el escritor. Aquí hemos inicializado 10 lectores y 5 escritores. La función SEM_INIT inicializará el semáforo. Para bucles se usan aquí por separado tanto para los lectores como para los escritores. Pthread_create creará las funciones de lectura y escritura. Además, pthread_join se unirá a los hilos. Cada uno para bucle usará esta articulación 5 veces para el propósito del escritor y luego 10 veces para el propósito del lector.

Y al final, el semáforo se destruye respectivamente después del uso. Compilar el código y luego ejecutarlo. Verá que los números aleatorios para el lector se generan dentro de 10 tamaños de matriz con el conteo 1. Y para el escritor, se modifican 5 números.

Conclusión

El artículo 'SEM_INIT' es una función utilizada por los semáforos en el proceso de lectura múltiple para priorizar las tareas que ocurren simultáneamente. Hay muchas otras funciones relacionadas con semáforos, también discutidas aquí. Hemos explicado dos ejemplos elementales para explicar el uso de SEM_INIT en las funciones y otras características.