No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Problemas de la concurrencia

13/21
Recursos

La programación concurrente se basa en el uso de hilos. Cuando tenemos varios hilos compartiendo recursos entre sí se pueden presentar algunos problemas, entre ellos:

Carreras (race conditions)

Los race conditions ocurren cuando dos o más hilos desean acceder a un recurso lo más pronto posible. Por ejemplo, tenemos una variable C inicializada en 0, pero después en alguna parte del código a C se le asigna el valor de C + 1. Entonces un hilo llegará primero y al ver que vale 0, le agregará el valor de 1, almacena ese dato y ahora C vale 1.

Pero si otro hilo llega después, pensará que C vale 1, entonces añadirá otro 1, almacenará ese dato y entonces C vale 2. Esto puede ser un problema en un sistema automatizado de dosificación de medicamentos. Sí el sistema es concurrente, ¿Entonces que hará? ¿Le dará una dosis o dos dosis? ¿Cómo se resuelve?.

Puntos muertos (deadlock)

Un deadlock ocurre cuando un hilo espera por un evento que nunca sucederá. Para que suceda un deadlock deben de cumplirse 4 condiciones:

  • Los hilos deben tener acceso exclusivo a los recursos.
  • Los hilos deben contener algunos recursos mientras esperan otros.
  • Los recursos no se pueden eliminar de los hilos en espera.
  • Existe una cadena circular de hilos en las que cada uno contiene uno o más recursos del siguiente hilo.

Problema de los filósofos

El problema de los filósofos plantea que hay una mesa redonda con 5 filósofos conversando. Frente a ellos hay un plato de comida, y hay un palillo chino a la derecha y otro a la izquierda (5 palillos en total). Para comer se necesitan dos palillos chinos, eso significa que no todos podrán comer al mismo tiempo.

Hay muchas formas de abordar el problema, pero esas soluciones pueden dar otros problemas. Podría ser un sistema de turnos, pero entonces algunos se quedarían esperando hasta que la comida esté fría.

Estrategias para evitar los deadlocks

Dos estrategias para evitar que se cumpla alguna de las condiciones que producen deadlocks son el uso de semáforos o monitores.

  • Semáforos: Funcionarían como una variable de tipo entero, asociado a un mecanismo de cola de hilos. Si el semáforo toma valores de “0” y “1”, es binario. En caso contrario, es un “semáforo contador”.
  • Monitores: Estructuras de datos abstractas basados en los monitores o kernel de los S.O. Los monitores tienen 4 componentes principales:
    • Inicialización: contiene código a ser ejecutado.
    • Datos privados: procedimientos que se utilizan desde dentro del monitor.
    • Métodos del monitor: procedimientos que se pueden llamar desde fuera.
    • Cola de entrada: hilos que llaman a algún método del monitor, pero no tienen permiso para ejecutarse aún.

Algunos lenguajes que implementan concurrencia

Estos lenguajes pueden hacer uso de la concurrencia, aunque de forma distinta entre ellos.

  • JavaScript
  • C#
  • Golang
  • Rust
  • Elixir
  • Haskell

Conclusión

La programación concurrente nos ayuda a ejecutar procedimientos de manera más eficiente en algunos casos, al no ejecutarlos de manera secuencial. Sin embargo, la programación concurrente trae una serie de problemas como las race conditions y deadlocks, para los cuales hay distintas estrategias que ayudan a evitarlos.

Contribución creada por: Ciro Villafraz con los aportes de Valentina Barrios.

Aportes 64

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Una solución alternativa que se me podría ocurrir para el caso de los filósofos… (es algo raro y asqueroso pero… jaja)
.
Podrían ser filósofos que tengan cierta sincronización al comer, cuando un filósofo se mete la comida a la boca, este deja los palillos en la mesa y otro filósofo aprovecha a tomar uno de los palillos para meterse su porción de comida y después dejar los palillos en la mesa y después otro filósofo aprovecha a tomar uno de los palillos… y así sucesivamente hasta que el primer filósofo trague su pedazo de comida y pueda tomar de nuevo su palillo que ya debió de haber sido liberado antes 🤔

Hola Platzinauta. 👋
Te comparto mis apuntes para que #NuncaParesDeAprender. 👀✍

Problemas de concurrencia

Carreras (Critical races)

Sucede cuando dos o más hilos desean acceder a un recurso lo más pronto posible. Podemos ver este ejemplo, tenemos una variable C, inicializamos en 0, pero después en alguna parte del código a C, le asignamos el valor de C + 1, entonces un hilo llegará primero y al ver que vale 0, le agregará el valor de 1, almacena ese dato y ahora C vale 1. Pero sí otro hilo llega después, pensará que C vale 1, entonces añadirá otro 1, almacenará ese dato y entonces C vale 2. Esto puede ser un problema en un sistema automatizado de dosificación de medicamentos. Sí el sistema es concurrente, ¿Entonces que hará? ¿Le dará una dosis o dos dosis? ¿Cómo se resuelve?.

Puntos muertos (deadlock)

Ocurre cuando un hilo espera por un evento que nunca sucederá.

Para que suceda un punto muerto deben de cumplirse 4 condiciones:

  • Los hilos deben tener derechos exclusivos a los recursos.
  • Los hilos deben contener algunos recursos mientras esperan otros.
  • Los recursos no se pueden eliminar de los hilos en espera.
  • Existe una cadena circular de hilos en las que cada uno contiene uno o más recursos del siguiente hilo.

Problema de los filósofos

El problema plantea que hay una mesa redonda donde hay 5filósofos que están conversando, frente a ellos hay un plato de comida, a su derecha y a su izquierda, hay otros filósofos y hay un palillo chino a la derecha y otro a la izquierda, para comer se necesitan ambos palillos chinos, eso significa que habrá una persona que no comerá. Hay muchas formas de abordar el problema, pero esas soluciones pueden dar otros problemas, podría ser un sistema de turnos, pero entonces algunos se quedarían esperando hasta que la comida esté fría o tenga mucha hambre. Podríamos hacer que se alternen los turnos de comida.

Estrategias

Evitar que se cumpla alguna de las condiciones

  • Semáforos: Funcionarían como una variable de tipo entero, asociado a un mecanismo de cola de hilos. Si el semáforo toma valores de “0” y “1”, es binario. En caso contrario es un “semáforo contador”.
  • Monitores: Estructuras de datos abstractas basados en los monitores o kernel de los S.O.

Los monitores tienen 4 componentes principales:

  • Inicialización: Contiene código a ser ejecutado.
  • Datos privados: Procedimientos que se utilizan desde dentro del monitor.
  • Métodos del monitor: Procedimientos que se pueden llamar desde fuera.
  • Cola de entrada: Hilos que llaman a algún método del monitor pero no tienen permiso para ejecutarse aún.

Algunos lenguajes

  • JavaScript
  • C#
  • Golang
  • Rust
  • Elixir
  • Haskell

partir los palillos así todos los filósofos comen

¿Esto puede ser lo que se llama vulgarmente cuello de botella? Lo pregunto cuando recuerdo el caso de, por ejemplo, el programa se ralentiza porque le estamos mandando mucha información a la grafica y hay poca memoria, con lo que el programa tiene que ir mandando poco a poco los datos. ¿estoy en lo correcto?

⚠️ Al lidiar con varias tareas, los programas concurrentes pueden presentar varios problemas como las critical races, deadlock, aplazamiento indefinido e injusticia.

Los filósofos deberán implementar un sistema de turnos dobles en el que en cada turno comerán dos filósofos separados entre ellos por otro filósofo. Para que haya orden empezarían el 1 y 3, mientras 2, 4 y 5 hablan, terminan, le toca al 2 y 4 (wácatela compartir ols palillos 😝) mientras 1,3 y 5 hablan, terminan, luego 3 y 5, terminan (aquí el 3 ya comió dos veces), luego el 4 y 1 (ya comieron los dos dos veces) y así sucesivamente hasta que se termine la comida. Estoy segura que debe haber una forma matemática de expresar esto 🤔

Mi solución para el problema de los filósofos es tomar un palillo, partirlo en 2 y usarlo 🤠.
.
Ya que el profesor no puso tantas limitantes…
.
Ir a comprar más
.
Preguntar por más palillos, pudo ser un error del que organizó todo en la mesa.
.
Lo más apegado a la analogía es que coman en el orden que llegaron, quizá tener un tipo de prioridad para los más de mayor edad

En lo que respecta al problema de los filósofos: Considero que cada uno debería tomar un palillo y partirlo por la mitad y así no tendría que compartir su palillo con ninguno de los demás filósofos.
(Y de esa manera no se contagian,** jajaja, es broma**)

La mejor solución seria romper los palo a la mitad

Yo sentaría a los filósofos (conforme a un reloj análogo) siendo la 1 el primer filosofo, empezaría de derecha a izquierda, un bocado por turno, dejando los palillos para que coma el otro filosofo y así hasta terminar

Pues dado que se tratan de palillos, cortaría palillo a la mitad y pues tendría 5 pares de palillos para cada filósofo, no sé si tiene sentido pero bueno es una solución 😄

creo para el problema de los filosofos hay varias manera de resolver, para mi una solucion , que uno coma mientras los otros discuten, en sentido horario, asi se ejecuraria o comeria cada uno mientras los otros discuten

con los filosofos que cada uno alimente al que esta al lado en la boquita y listo!!

como un carrusel!!!
xd

Problemas de la concurrencia
Carreras (critical races): sucede por ejemplo al inicializar una variable en 1, agregarle 1 y almacenarlo. Un hilo puede llegar y pensar que la variable ya vale 1 y por eso agregarle 1 y ahora la variable sumó 2

Puntos muertos (Deadlocks)
Cuando un hilo se queda esperando un evento que nunca sucederá. Sucede cuando se dan 4 condiciones:

  1. Los hilos deben tener derechos exclusivos a los recursos
  2. Los hilos deben contener algunos recursos mientras esperan otros
  3. Los recursos no se pueden eliminar de los hilos en espera
  4. Existe una cadena circular de hilos en las que cada uno contiene uno o más recursos del siguiente hilo

Estrategias para abordar los problemas de concurrencia

  • Semáforos: puede ser binario (puede pasar o no) o contador
  • Monitores: contienen una inicialización, datos privados, métodos y una cola de entrada

SOLUCIÓN PROBLEMA DE LOS FILOSOFOS
Como utilizar la concurrencia en este escenario:

Cantidad filosofos = 5
Cantidad recursos palillos = 2
Cantidad operaciones simultaneas = 2

Su poniendo que dos filosofos comiencen a comer al tiempo, los recursos podrian bloquearse cuando estos empiecen a masticar, lo cual abria tiempo para que otros dos filosofos limpien los palillos y inicien a comer, y asi sucesivamente.

Este problema no tiene una solución segura, a menos que se puedan conseguir mas palillos y de esta forma cada uno tenga sus palillos.

bueno, según razonamiento para los filósofos, y filosofando en la lógica de esto, son muchas posibilidades entre las que tenemos una gran cantidad de variables a tomar en cuenta que llegar a una respuesta es complicado.

se puede aplicar, sistema por turnos.
comer con las manos.
pedir más palillos.
cambiar de plato.
pedir un plato que no amerite usar palillos.

ahora si lo planteado es tener el límite que se presenta, y es obedecer las reglas, pienso que todo depende de los límites que se vallan a plantear.

opciones siempre hay solo sería tomar la mejor opción que se presente.

Una opción para el problema de los filósofos es que se repartan la comida entre todos y a cada quien se le asigne su porción de alimento. Para resolver la falta de palillos podrían 1) comer con la mano 2) avisarles de que lleven los palillos traídos desde casa ya que en el restaurante no habrá 3) Ahh, y también que cada quien lleve su platito desde casa.

Saludos

Para resolver el problema de las carreras en la concurrencia se me ocurren 2 ideas: 1) crear copias virtualizadas para cada recurso que lo necesite en la medida que aumenten las instancias que acceden a sus recursos 2) Programar un desencadenador que indique que se deben crear copias del recurso al que se accede cada vez que una nueva instancia lo necesite o indicarle que aumente su capacidad o que asigne un espacio de memoria que aumente de forma dinámica con base a la necesidad, es decir, un sistema flexible que crece o disminuye cuando se haga necesario. ¿Creen que es una solución aceptable? ¿Sí, no, por qué?

Gracias por sus comentarios

si en el caso los palillos son de metal y no se pueden partir a la mitad, se tienen que sincronizar a las manecillas del reloj empezando con el filosofo 1 come y suelta el palillo izquierdo, lo toma filosofo 2 y hace lo mismo suelta palillo izquierdo lo toma filosofo 3...para mantener la platica y un ciclo de alimentación😁
### **Problemas clave en el sistema:** 1. **Interbloqueo (Deadlock):** Ocurre si todos los filósofos toman el tenedor a su izquierda al mismo tiempo y esperan el tenedor a su derecha. Ninguno puede continuar porque están bloqueados esperando recursos que nunca serán liberados. 2. **Condición de espera indefinida (Starvation):** Si un filósofo nunca tiene acceso a ambos tenedores debido a que otros los toman constantemente, ese filósofo puede quedar atrapado en un estado de espera indefinida. 3. **Rendimiento bajo:** Si los filósofos no coordinan correctamente, algunos pueden estar inactivos más tiempo del necesario, reduciendo el aprovechamiento de recursos.
El **problema de los filósofos comensales** es un clásico en informática teórica, específicamente en la **sincronización de procesos** dentro de sistemas operativos. Fue planteado por el científico informático Edsger Dijkstra en 1965 como un ejemplo de los retos asociados con la concurrencia. ### **Contexto del problema** Imagina a cinco filósofos sentados alrededor de una mesa circular. Cada filósofo pasa su tiempo alternando entre dos actividades: **pensar** y **comer**. En la mesa hay un plato de comida frente a cada filósofo y un único tenedor entre cada par de filósofos. #### **Reglas del problema:** 1. Para que un filósofo pueda **comer**, necesita tener en sus manos **los dos tenedores adyacentes** (uno a la izquierda y otro a la derecha). 2. Un filósofo puede **pensar** sin necesidad de los tenedores. 3. Solo puede haber cinco tenedores disponibles, uno entre cada filósofo.
Yo hubiera partido los palillos a la mitad y listo. Cada uno tiene su par y comen en paralelo.
La programación concurrente se basa en el uso de **hilos**. Cuando tenemos varios hilos compartiendo recursos entre sí se pueden presentar algunos problemas, entre ellos: ## Carreras (race conditions) Los **race conditions** ocurren cuando dos o más hilos desean acceder a un recurso lo más pronto posible. Por ejemplo, tenemos una variable C inicializada en 0, pero después en alguna parte del código a C se le asigna el valor de C + 1. Entonces un hilo llegará primero y al ver que vale 0, le agregará el valor de 1, almacena ese dato y ahora C vale 1.
Pienso que seria que uno de los filósofos partiera sus cubiertos. Ya que el tiempo apremia para que todos puedan disfrutar de la comida.

como el numero maxim de filosofos maximo que va a comer al imepo es 2 se debe y permitiendo que de a 2 coman hasta terminar, pero teneindo un limite de espera para no genrar mas puntos muertos

Si son 5 filosofos y hay en la mesa 5 palillos, podrían romper en dos cada palillo y así podrán comer todos por igual.

Es interesante, no sabia que en algunos lenguajes de programacion puede haber un trafico de hilos y que estos pueden perjudicarnos al momento de trabajarlo. Que bueno tener ese dato en cuenta. Nunca pense que JS, C# y GOLANG tienen ese problema de hilos. Si que desconocia ese tema pero almenos se lo que debo evitar.

Buenas, una forma que se me ocurre de resolverlo es similar a cómo funciona la concurrencia en sí mismo. Digamos que los palillos solo tienen un tiempo determinado para usarse por filósofo y cuando termina ese tiempo, van rotando en la mesa. Así sucesivamente hasta que terminen.
No es la mejor solución pero fue lo que se me ocurrió de manera rápida jajaja Saludos!

que partan los palillos por la mitad, asi quedan con dos paloillos cada uno, … sino que coman con las manos :3

Son como cochinos esos filósofos, hasta podría comer con la mano. como también dijo ¿que pasaría si llegan más?. Lo que se hace en los restaurantes, turnos y si son amigos y no les importa partir los palillos 🍜

solicitar otros palillos a la persona encargada

en el problema de los filósofos la solución que se me ocurre es partir los palillos a la mitad o comer con la mano no?

Sopa para todos y no se necesitan palillos!

Fácil; se cambian los palillos por cucharas.

Les dejo videito!!

Veo tantas soluciones complicadas, qué no podían simplemente traer más palillos?

Yo creo que hubiera sido mejor avisarles a lo filosofoz desde antes para que llevarán sus propios palillos y así que nadie se quedaria sin palillos.

Tenian 5 palillos y eran 5 filosofos por lo que necesitarian 10 palillos como faltan 5 si cortan el palillo a la mitad tendrian 5x2 palillos osea 10 y solucionado.

Problemas de la concurrencia

Carreras (critical races)

Este problema ocurre cuando modificamos cierta información que se va guardando en distintos hilos que al ser concurrentes van a llegar en distinto tiempo, por lo tanto, esta información puede ser diferente, lo cual puede afectar al programa.

Puntos muertos (deadlock)

Ocurren cuando un hilo se queda bloqueado (esperando otro hilo) de manera indefinida.
Para que ocurra un punto muerto se requieren 4 condiciones:

  • Los hilos deben poseer derecho exclusivo a los recursos
  • Los hilos contienen a otros recursos mientras esperan
  • Los recursos no se pueden eliminar de los hilos de espera
  • Existe una cadena circular de hilos en las que cada uno contiene uno o más recursos del siguiente hilo.

Estrategias

  • Semaforos: Funcionan con variables de tipo entero que sirven para identificar un estado que puede ser interpretado. Al igual que un semaforo de la vida cotidiana.
  • Monitores: Estructuras de datos abstractas basados en los monitores o kernel de los S.O. Posee 4 componentes principales:
    • Inicialización: codigo a ser ejecutado
    • Datos privados: procedimientos que se utilizan desde dentro del monitor
    • Métodos del monitor: procedimientos que se pueden llamar desde afuera
    • Cola de entrada: hilos que llaman a los metodos del monitor pero sin permiso para ejecutarse aún.

Que impriman más palillos y ya

Mi idea para resolver el problema de los filósofos sería que las personas se sincronices a comer de la siguiente forma. Será por bocados, un bocado y luego cambian de turno

1ro comerán los filosofos 1 y 3
2do comerán los filosofos 2 y 4
3ro comerán los filosofos 3 y 5
4to comerán los filosofos 4 y 1
5to comerán los filosofos 5 y 2

Si seguimos este ciclo, podemos ver que alcanzan a comer de a dos bocados por ronda completa, lo que aceleraría la velocidad entre bocado y bocado

Una solucion que se me ocurrio, para no andar pasando los palillos de uno a otro filosofo, partirlos en dos seria mejor opcion y menos asquerosa xd

Les planteas un problema de programación sin resolver y los dejas en ayuno.
El ayuno es una buena recomendaciòn para llegar a estados altos de conciencia (Los yoguis, los acetas,chamanes, Daniel en la biblia, Los diferentes budas, entre otros). Se van a preocupar más por resolver problemas filosóficos que por comer. Al final cada quien comera a su tiempo sin importar que la comida este fría

me encantó la solución del semaforo… peor me cuesta un poco entender su implementación 😕

PROBLEMAS DE LA CONCURRENCIA
.
Uno de los problemas de la concurrencia son las critical races “carreras” suceden cuando 2 o mas hilos desean acceder a un recurso lo mas pronto posible.
.
Otro problema de la concurrencia son los deadlock “puntos muertos” ocurren cuando un hilo se queda esperando el acceso a un recurso necesario para ejecutar su tarea de forma indefinida ya que nunca puede acceder y por lo tantos las tareas no serán ejecutadas y se vuelve un problema.
.
Para que suceda un punto muerto deben cumplirse 4 condiciones
.

  1. Los hilos deben tener derechos exclusivos a los recursos.
  2. Los hilos deben contener algunos recursos mientras esperan otros.
  3. Los recursos no se pueden eliminar de los hilos en espera.
  4. Existe una cadena circular de hilos en las que cada uno contiene uno o mas recursos del siguiente hilo.
    .
    Existen distintas estrategias para poder evitar puntos muertos
    .
    Evitar que se cumplan algunas de las condiciones
    .
  • Semáforos.
  • Monitores.
    .
    Semáforos
    Son variables de tipo entero asociado a un mecanismo de cola de hilos. El uso de semáforos atravesó de variables de estado suena muy similar al paradigma de programación dirigida por eventos en los semáforos se realiza al nivel de los hilos.
    .
    Monitores
    Son una estructura de dato basado en el kernel que de los sistemas operativos el cual tiene 4 componentes principales
    • Inicialización
    • Datos privados
    • Métodos del monitor
    • Cola de entrada
      .
      la concurrencia puede manejarse de diferente forma entre un lenguaje y otro. Es por esto que es importante conocer la documentación del lenguaje de programación, leer sobre como este lenguaje maneja la concurrencia y así poder resolver los problemas que se presenten cuando se implante el lenguaje.

componentes de un monitor de problemas de concurrencia

No sé si es un poco floja mi solución, pero podrían partir los palillos, o podrían compartir un plato dividiendo el número de filósofos por plato, así pueden aplicar algún sistema de turnos y el tiempo de espera sería menor.

Como solamente abrían dos pares de palillos, empezarían a comer los dos primeros filósofos con diferencias de un lapso corto de tiempo, Ejm: de un min; en el momento que termine el primero (que fue el que empezó a comer primero), le pasa los palillos al tercero, y después que termine el segundo, le pasa los palillos al cuarto y así sucesivamente :p

Se me ocurre ahora con la nueva arquitectura Alder- Lake de Intel tienen una tecnología que se llama Thread Director, es una solución a los problemas de concurrencia que pudieran existir a la hora de asignar recursos.

Lo que podríamos hacer es dividir los palitos, serían 10 por lo que cada filosofo podría comer, claro un poco más lento, pero podría. Pasándolo a un entorno tecnológico, sería como que un 5 hilo dividiera su poder en 2 para que 5 métodos que requieren 10 puedan ser ejecutados, obvio de manera más lenta pero al final se podrían ejecutar. Soy nuevo en tec, si es que he dicho algo falso con respecto a los hilos o métodos me sería de mucha ayuda su feedback

pueden romper los palillos a la mitad y cada uno tendrá dos palillos

Los semáforos permiten al programador asistir al planificador del sistema operativo en su toma de decisiones de manera que permiten sincronizar la ejecución de dos o más procesos.

Un Servidor Concurrente Un servidor concurrente atiende a varios clientes al mismo tiempo.
Se trata de crear un nuevo proceso o línea de ejecución cada vez que un cliente “llega” a pedir un servicio.

Dos procesos son concurrentes cuando se ejecutan de manera que sus intervalos de ejecución se solapan. Concurrencia aparente: Hay más procesos que procesadores. Concurrencia real: Cada proceso se ejecuta en un procesador.

¿Tiene algo que ver que sean filósofos?

Es decir, me inquieta un poco. Me hace sentir que ese dato tiene un papel importante en la solución. …

Se que solo es un ejercicio, pero es divertido hacerse esas preguntas

Lo que se me ocurrió fue dejar al que tenga menos comida, coma primero y dejar al final al que tiene mas comida.

Si a alguien le surgio la duda de que es un Kernel?
Es el nucleo de un sistema operativo la base de su funcionamiento o un estandar…
Ejemplo facil seria Linux es kerneñ base de sistemas operativos como Ubuntu, Debian, Manjaro, Kali, etc

El Problema De Los Filosofos

Son 5 filósofos son 5 palillos y se sabe que se comen con 2 palillos por persona así que llegamos a la conclusión que 2.5 palillos van a ser utilizado(para efectos prácticos me voy a limitar a usar numero naturales) y sabiendo que 0.5 = 1 palillo, lo descartamos ya que no se puede comer con un palillo además, a cada filosofo le vamos a asignar un nombre al filosofo 1 " f1 " al filosofo 2 " f2 " y así sucesivamente hasta llegar a 5. Teniendo esto como base pasemos a darle forma.

Primero f1 y f2 van a ser los primeros en comer, ya que seria injusto dejar a f3 y a f4 esperando mucho tiempo vamos a asignarle que f1 y f2 van de dos a tres mordidas siempre y cuando las mordida vayan a dar sean de la mis cantidad o sea, si f1 muerde 2 veces f2 morderá 2 veces, si f2 muerde 3 veces f1 morderá tres veces. Ahora supongamos que le dieron " x " mordidas (3 >= x >=2 ) entonces ahora le toca a f3 y a f4 los cuales van a heredar las mismas funciones de f1 y f2 y solo falta f5, Aquí tenemos un problema ya que para que sea todo parejo necesito que f3 o f4 sedan sus palillos pero f5 solo puede tener 1par por ende quedaría 1par no hay problema pero no el lo mas optimo por eso f4 va a dar sus palillos a f5 y 3 va dar sus palillos a f1 o f2 para efectos prácticos digamos que a f1 entonces ya no quedan palillos desperdiciados. Ahora vamos a hacer un ciclo ya que f1 y f5 ya comieron solo quedan f2 ,f3 y f4 dándole prioridad a f2 ya que es el que a pasado mas tiempo sin comer por ende f5 da su palillos a f2 y f1 le devuelve el favor y le da sus palillos a f3 ahora a que f2 y f3 ya comieron faltan f1 f4 y f5 dándole prioridad a f4 porque es el que a pasado mas tiempo sin comer y ya que f2 quiere devolverle el favor a f5 se los da a el y así sucesivamente dándole siempre prioridad al que a estado mas tiempo sin comer y devolviendo el favor hasta que todos hayan terminado quizá no al mismo tiempo pero si de la manera mas justa y optima en mi opinión.

Para el problema de los filósofos:
Removería uno de los 5 palillos, ya que no se puede hacer nada con él y agrega complejidad innecesaria. Le daría un turno a cada filósofo, de esa forma cada que un filósofo desocupe el par de palillos entre bocados, se los podrá pasar al siguiente en turno. El turno se repite hasta que terminen de comer.

El problema de los Filósofos

una forma de que puedan usar los palillos seria que el filosofo uno y tres tomen los palillos de su derecha e izquierda y como un bocado, luego los pueden dejar los palillos en sus respectivos lugares para que continúen los filósofos dos y cuatro luego seguiría el filosofo 5 y también el filosofo dos quien iría por el segundo bocado. y así sucesivamente hasta terminar la comida.

Pueden usar el plato como “cuchara” y un palillo como “tenedor”

Como son filósofos están programados por el cosmos y de manera intermitente comerían sin así cruzarse palillos
Otra opción podría ser incluso al compas de un vals o de luces que indicaran el turno de tomar palillos, tomar alimento pasar bocado. Hasta la misma mesa podría tener plataformas dividas para cada filosofo y estas a su vez bajarían y subirían para dar el turno justo de alimentación .