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.
Tabla de contenidos
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.