es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de comensales salvajes: Semáforos y Mutex

He encontrado el problema y la solución de los salvajes comensales, pero no parece entender cómo la solución maneja la situación cuando un salvaje intenta comer de la olla mientras todavía está vacía.
El problema y la solución de “Little Book of Semaphores” son los siguientes:

Una tribu de salvajes come cenas comunitarias de una gran olla que puede contener M porciones de misionero guisado. Cuando un salvaje quiere comer, se sirve de la olla, a menos que esté vacía. Si la olla está vacía, el salvaje despierta al cocinero y luego espera hasta que el cocinero vuelva a llenar la olla.
Cualquier número de hilos de salvajes ejecutan el siguiente código no sincronizado de los salvajes:

while True :
    obtenerPorcionDeOlla()
    comer()

Y un hilo de cocinero ejecuta este código no sincronizado de cocinero:

while True:
    colocarPorcionesEnOlla(M) 

Las restricciones de sincronización son:

  • Los salvajes no pueden invocar obtenerPorcionDeOlla si la olla está vacía.
  • El cocinero solo puede invocar colocarPorcionesEnOlla si la olla está vacía.

Acertijo: Agregue código para los salvajes y el cocinero que satisfaga la sincronización.

Solución (cocinero):

while True:
    ollaVacia.wait()
    colocarPorcionesEnOlla(M)
    ollaLlena.signal()

Solución (salvajes):

while True:
    mutex.wait()
    if porciones == 0:
        ollaVacia.signal()
        ollaLlena.wait()
        porciones = M
    porciones -= 1
    obtenerPorcionDeOlla()
    mutex.signal()

    comer()

Mi pregunta es: cuando llegamos por primera vez a porciones = 0, después de que M salvajes comieron de la olla, llegamos a ollaVacia.signal() y luego a ollaLlena.wait() – Ambos semáforos; entonces, desde mi punto de vista, puede haber un caso especial en el que podemos llegar a obtenerPorcionDeOlla antes de que el cocinero tenga la oportunidad de obtener el contexto y llenar la olla. ¿Me estoy perdiendo algo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    No, no te estás perdiendo nada. La solución proporcionada en el Libro Pequeño de Semáforos asume que el hilo del cocinero siempre puede llenar la olla antes de que un hilo salvaje ejecute getServingFromPot(). Sin embargo, en realidad, puede haber casos en los que algunos hilos salvajes ejecuten getServingFromPot() antes de que el cocinero tenga la oportunidad de llenar la olla. Esto se conoce como una condición de carrera.

    Para manejar este escenario, necesitamos modificar la solución para asegurarnos de que ningún hilo salvaje pueda ejecutar getServingFromPot() antes de que el cocinero haya vuelto a llenar la olla. Una forma de hacer esto sería introducir otro semáforo, llamado fillPot, al cual el hilo del cocinero envía una señal una vez que ha vuelto a llenar la olla. Los hilos salvajes esperarán en este semáforo antes de ejecutar getServingFromPot().

    Así es cómo se vería la solución modificada:

    Hilo del cocinero:

    while True:
        emptyPot.wait()
        putServingsInPot(M)
        fullPot.signal()
        fillPot.signal() # señalar el semáforo fillPot para notificar a los salvajes que la olla ha vuelto a llenarse
    

    Hilo salvaje:

    while True:
        mutex.wait()
        if servings == 0:
            emptyPot.signal ()
            fillPot.wait() # esperar al semáforo fillPot
            servings = M
        servings -= 1
        getServingFromPot ()
        mutex.signal()
    
        eat()
    

    Con esta modificación, nos aseguramos de que ningún hilo salvaje pueda ejecutar getServingFromPot() antes de que el cocinero haya vuelto a llenar la olla, y de esta manera evitamos cualquier condición de carrera.

Comments are closed.