Categorías: Programacion

Programacion paralela en C : Acceso concurrente


En la entrada anterior os contaba que había realizado un pequeño truco para que el programa funcionase. Esto es debido al acceso concurrente.

Acceso concurrente

Esto de acceso concurrente a un recurso puede parecer a simple vista algo raro o complejo de entender, así que veámoslo con un ejemplo:
Si por ejemplo tenemos dos teléfonos fijos en casa, que los llamaremos A y B en la mayoría de los casos solo uno de los dos puede utilizar la línea para hablar. Así si A y B se ponen a llamar a la vez seguramente ocurrirá que se entrecruzan las conversaciones y hay interferencias entre las mismas. Por ello si A está llamando B tiene que esperar a que A acabe de usar la línea para luego utilizarla él.

Recursos y usuarios

Normalmente se suele utilizar estas dos palabras como terminología básica en el acceso concurrente:

  • Recursos: son los elementos, dispositivos o datos a los que se quiere acceder.
  • Usuarios: son las personas, programas o cualquier otro sistema que necesita acceder a un recurso.

Uno de los primeros pasos que debemos realizar al trabajar con programación paralela es la identificación de cuales son nuestros recursos, si admiten acceso concurrente y cuales son los usuarios para cada recurso.

Ejemplo de acceso concurrente

En el artículo anterior había un ejemplo de acceso concurrente a un recurso, ya que tenemos dos procesos (dos usuarios), el usuario padre y el usuario hijo y los dos quieren escribir a la vez en la salida por pantalla (stdin).

¿Cómo controlo el acceso concurrente?

Hay varias maneras de gestionar este tipo de problemas, que son muy pero que muy frecuentes trabajando con paralelismo. Para ello se pueden tomar distintas soluciones:

  • Pausas: esta solución NO SE DEBE USAR NUNCA, consiste en pausar durante un tiempo determinado a uno de nuestros usuarios para que no interfiera con el otro. Es la solución que usaba el otro día, al insertar un sleep en el código. No se debe usar porque además de ser una chapuza, retrasa en demasía la ejecución del programa y además en algunos casos puede fallar.
  • Semáforos: esta solución será explicada en el siguiente artículo de programación paralela y es el método más extendido de gestionar este tipo de situaciones.

Si tenéis ganas de realizar una prueba sobre esto, coger el código anterior, quitar el sleep e introducir un texto más grande para sacar por pantalla y veréis que en algunas ejecuciones se entrecruzan los datos.

Jorge Durán

Entusiasta de la tecnología desde los 10 años, desarrollador y creador de varios proyectos de software y autodidacta por naturaleza. Ingeniero Informático por la USAL y .Net backend developer en idealista.

Share
Publicado por
Jorge Durán

Recent Posts

Docker: conceptos principales y tutorial paso a paso

Hoy queremos hablaros de Docker un proyecto que cada día es más usado, porque permite…

3 años hace

Crea diagramas rápidamente usando código

Cada vez estamos más acostumbrados a usar código para generar la infraestructura (IaC), documentar nuestro…

3 años hace

Procesamiento del lenguaje natural con ElasticSearch

Uno de los problemas que se presentan con una mayor frecuencia hoy en día, es…

4 años hace

Elige tecnología clásica y aburrida

Uno de los problemas que solemos tener los programadores, es que nos gusta estar a…

4 años hace

Cómo usar Docker en Windows

Docker es una de las herramientas más usadas por los desarrolladores, sin embargo, usarlo en…

4 años hace

Analiza el coste del uso de JavaScript

Como seguramente sabrás el uso de JavaScript ha crecido exponencialmente en los últimos tiempos, sin…

4 años hace