Desarrollo y Análisis de la Cena de los Filósofos

0

 


La Cena de los Filósofos es un problema clásico en la concurrencia y la sincronización de procesos. Consiste en un grupo de filósofos sentados alrededor de una mesa circular, con un plato de espaguetis entre cada par de filósofos. Cada filósofo alterna entre pensar y comer. Sin embargo, para comer, un filósofo necesita tener ambos tenedores adyacentes.

El problema principal es evitar el interbloqueo (deadlock), donde todos los filósofos están pensando y ninguno puede comer, y también evitar el hambre eterna, donde un filósofo no puede empezar a comer porque los tenedores están siendo utilizados por sus vecinos.

A continuación, te proporciono un análisis básico y un script en Python para simular la Cena de los Filósofos utilizando el mecanismo de hilos (threads) y semáforos.


import threading
import time
import random

class Filosofo:
    def __init__(self, nombre, tenedor_izquierdo, tenedor_derecho):
        self.nombre = nombre
        self.tenedor_izquierdo = tenedor_izquierdo
        self.tenedor_derecho = tenedor_derecho

    def pensar(self):
        print(f"{self.nombre} está pensando.")
        time.sleep(random.uniform(1, 5))

    def comer(self):
        print(f"{self.nombre} está comiendo.")
        time.sleep(random.uniform(1, 5))

    def run(self):
        while True:
            self.pensar()
            self.tenedor_izquierdo.acquire()
            self.tenedor_derecho.acquire()
            self.comer()
            self.tenedor_derecho.release()
            self.tenedor_izquierdo.release()

def main():
    num_filosofos = 5
    tenedores = [threading.Semaphore(1) for _ in range(num_filosofos)]
    filosofos = []

    for i in range(num_filosofos):
        tenedor_izquierdo = tenedores[i]
        tenedor_derecho = tenedores[(i + 1) % num_filosofos]
        filosofo = Filosofo(f"Filósofo-{i+1}", tenedor_izquierdo, tenedor_derecho)
        filosofos.append(threading.Thread(target=filosofo.run))

    for filosofo_thread in filosofos:
        filosofo_thread.start()

    for filosofo_thread in filosofos:
        filosofo_thread.join()

if __name__ == "__main__":
    main()

Este script crea un conjunto de filósofos que comparten tenedores. Cada filósofo piensa, luego intenta adquirir los tenedores izquierdo y derecho antes de comer. Después de comer, libera los tenedores para que otros filósofos los puedan utilizar. Este enfoque evita el interbloqueo y garantiza que cada filósofo pueda comer eventualmente.


Sin comentarios