Comenzamos con la implementación de una aplicación que lee y escribe en un fichero. La implementamos, tal y como hemos aprendido, controlando las posibles excepciones que se puedan producir. La aplicación, lee un valor entero de un fichero, lo incrementa en uno y lo escribe en el fichero. Comprobamos que esta aplicación, ejecutada, ella sola, repetidas veces, funciona como esperamos. Por lo tanto es correcta. Creamos una nueva aplicación, que creará 21 procesos de la anterior aplicación, todas ellas accediendo al mismo fichero. Los procesos, los creamos como ya hemos visto en un ejemplo de esta misma unidad. El resultado después de probar varias veces la ejecución de la aplicación con varios procesos a la vez, es que, el valor que guarda el fichero, no es 21 como era de esperar. Por lo que nos damos cuenta de que la aplicación de partida, no es tan correcta como pensamos. Para que sea correcta, tendremos que tener en cuenta que otros procesos pueden acceder a ese mismo recurso. También nos damos cuenta de lo complicado que es saber lo que está ocurriendo realmente durante la ejecución. Incluimos una modificación en la que todas las salidas estándar de las aplicaciones, van a un fichero, para poder abrir y revisar lo sucedido. Con ese fichero, podemos hacernos una idea de lo que ha pasado: el planificador del SO, de acuerdo a su función, ha ido otorgando tiempos de CPU a los distintos procesos y mezclando la ejecución de instrucciones de unos procesos con otros; varios procesos pueden leer el mismo valor y por lo tanto, después machacar el valor con el que ellos calculan. Vemos cómo se entremezclan las salidas del proceso que crea procesos y las lecturas y escrituras de los otros procesos. Dejamos planteada la pregunta ¿Cómo solucionamos estos problemas? Pregunta que iremos resolviendo con los distintos puntos de este apartado.