¿Qué tal si matas a tres filósofos y los dos restantes pueden comer infinitamente? Incluso obtienen un palillo de repuesto. Sin punto muerto, sin bloqueo en vivo, problema resuelto. 🙂
Bromas aparte, por ejemplo, tiene una función que actualiza dos variables y necesita poder paralelizar estas funciones, es decir, desea que diferentes hilos llamen a la función con cada una actualizando algunas (dos) variables. Los hilos son sus filósofos, mientras que las dos variables son los palillos.
Para garantizar un subproceso seguro, debe asegurarse de que no haya dos subprocesos que modifiquen estas dos variables al mismo tiempo. Una forma de hacerlo es bloquear las variables mientras un hilo lo está actualizando, para que otros hilos no tengan acceso. Esto se llama exclusión mutua (mutex). Una vez que el hilo termina de actualizar cada variable, lo libera (desbloquea) (las variables) para que estén disponibles para otros hilos (en espera), que compiten para obtener acceso. Pero solo se lanza una variable a la vez. Entonces, los hilos deben esperar para tener acceso a ambas variables antes de ejecutarse. Si esta concurrencia no se maneja con cuidado, podría dar lugar a una situación en la que un subproceso realmente rápido (alta prioridad) puede bloquear el acceso a ambas variables, liberarlo cuando termine y obtenerlo inmediatamente después. De esta manera, otros subprocesos (de baja prioridad) nunca tendrán la oportunidad de usar los recursos compartidos y, por lo tanto, pasar hambre. Este es el problema de los filósofos de comedor (hambrientos en este caso), es decir, ¿cómo se asegura de que cada hilo reciba su ‘oportunidad’ sin esperar demasiado en la cola?
- ¿Qué opinas de la clase 6.005: Elementos de construcción de software del MIT?
- ¿El cifrado de archivos protege del ransonware?
- ¿Por qué es que los mejores cerebros del Departamento de Ciencias de la Computación en los IIT, en última instancia, aterrizan en trabajos de banca de inversión con empresas como Goldman Sachs en lugar de trabajar hacia avances tecnológicos para la nación?
- Soy un estudiante de secundaria interesado en trabajar en la exploración espacial. ¿Qué puedo hacer ahora para prepararme?
- Si un informático se despertara en el año 1500, ¿cuánto tiempo les tomaría construir una computadora con estándares modernos?
Para mitigar esto, puede implementar un protocolo de manera que cada hilo después de usar un recurso no pueda obtenerlo inmediatamente después de liberarlo. Deben esperar una cierta cantidad de tiempo antes de que puedan intentar adquirirlo.
Otra forma sería implementar una cola de prioridad, de modo que la prioridad de los subprocesos aumenta cuanto más tiempo hayan estado esperando. De modo que durante la condición de carrera, el hilo con la prioridad más alta gana. De esta manera, incluso los subprocesos iniciales de baja prioridad pueden acceder a los recursos, ya que su prioridad aumenta con el tiempo de espera.