2009-04-22 7 views
9

Estoy buscando un algoritmo para aplicar al problema "lavavajillas en el trabajo".Buscando una solución para "Lavavajillas en el trabajo"

Si bien es genial poder poner tazas de café sucio, etc. en él, se encuentra rápidamente con "¿cuál es el estado de los platos?" dilema. Si caminas hasta la cocina, ¿puedes llevar los platos del lavavajillas porque están limpios y no se guardan? ¿Puedes poner un plato sucio en el lavavajillas o eso invalidará los platos limpios en él?

Parece un problema que debe tener un equivalente de programación. Tiene un proceso compartido que se desencadena de forma asincrónica y mueve objetos de un estado a otro. Necesita poder conocer el estado de los objetos en un momento dado. ¿Qué algoritmos se pueden aplicar?

Mi opción de partida es crear una bandera desplegable en el lavavajillas de "limpio" y "sucio". Cuando el lavavajillas se vacía, debe cambiarse a "sucio", cuando se lo usa debe cambiarse a "limpiar". ¿Hay problemas con ese algoritmo? ¿Hay uno mejor/menos propenso a errores?

Nota: No hay algoritmos que utiliza un programa de sondeo, por favor ...

+0

Deberías intentar tomar la vida más fácil :-))) Buen punto, aunque ... ¡Muy original! – Blerta

+1

No solo eso funciona, alguien nos gana al dinero ... http://www.amazon.com/Clean-Dirty-Dishwasher-Indicator-255/dp/B00004XSF9 –

Respuesta

1

Estoy asumiendo que todos los objetos en el lavavajillas debe estar limpio o sucio, pero no mezclar y combinar. La solución a continuación aplica esa propiedad. Si no, tu analogía no era del todo correcta.

Solo algunos mutexes deberían hacer el truco.

Tiene cuatro estados.

  • lavavajillas vacío, puede poner los platos sucios
  • Lavavajillas sucia, puede poner los platos sucios
  • lavavajillas en marcha, no se puede poner los platos sucios o eliminar los limpios.
  • Lavavajillas limpio, no puede poner platos sucios y puede quitar los más limpios.

Puede colapsar aún más vacío y sucio, ya que no le importa la diferencia.

  • Cuando un desea insertar algo, se espera en DirtyMutex
  • Cuando se desea iniciar el lavado, esperas en DirtyMutex para que no pierda agua;)
  • Cuando ha terminado el lavado, señalas CleanMutex
  • Cuando se desea vaciar el lavavajillas, que esperar en CleanMutex
  • Cuando el lavavajillas está vacía, usted señala DirtyMutex

Esto supone que puede saber cuándo el lavavajillas está vacío; de lo contrario, necesitará un semáforo de conteo para ElementsInDishwasher que espere antes de indicar DirtyMutex.

+0

Tener una cola de gente esperando que el lavavajillas termine de limpiar no es una solución. –

+0

Bueno, no estoy seguro de entender esto desde una perspectiva informática. Si quieren hacer otra cosa, deben sondear, no hay solución. Cada 'persona puede girar un hilo de espera' y establecer un valor una vez hecho, sondear internamente si así lo desean. – jfclavette

+0

Usar dos mutexes diferentes para un único recurso es arriesgado: depende de que todos los llamantes sigan un protocolo complicado. ¿Por qué no un único mutex que protege una bandera de cuatro estados? (También vea mi respuesta, publicada justo después de la suya.) –

1

Me gusta su analogía, pero el problema subyacente me preocupa. En mi experiencia, un sistema bien diseñado siempre sabe (por lo general implícitamente) el tipo de estado al que te refieres. Por ejemplo, un recurso en una cola de recursos compartidos está disponible para ser utilizado por otros procesos; si no lo fuera, no estaría en la cola.O bien, un recurso que está siendo modificado por un subproceso de trabajo está en cualquier estado en el que el procesamiento del subproceso indique que es más importante, ningún otro subproceso necesita para saber si está "limpio" o "sucio".

Hay un número alucinante de patrones de diseño válidos que no he encontrado (o inventado :-) aún, pero lo que está describiendo tiene la sugerencia de un olor de diseño (o platos sucios) en lugar de un válido patrón.

0

Solo necesita un solo indicador, como indicó (limpio/sucio). Los lavaplatos en general ya proporcionan este mecanismo: un bloqueo (físico).

  • Lavavajillas comienza vacío, desbloqueado
  • lavavajillas está desbloqueado, platos tan sucios pueden ser puestas en él
  • Antes de ejecutar el lavavajillas, se bloquea
  • Después de correr, todavía está bloqueado, lo que indica que todo el interior está sucio
  • Si quita algo de él, y no es el último elemento, se vuelve a bloquear que

En un sens de software e, el candado solo sirve para poner los platos en el lavavajillas; usted sabría si un plato que se está sacando está limpio o sucio según esté o no bloqueado, pero solo puede colocar un plato si está desbloqueado. Si tomas el último plato, lo desbloqueas.

+0

¿Cómo sabe cuándo termina el lavavajillas? –

+0

Supongo que sabe si el lavavajillas está encendido o no ("si entra a la cocina, lo oirá"), y el verdadero problema es saber en qué estado están los platos cuando la lavadora está apagada. Es obvio en qué estado están las cosas cuando la lavadora está encendida. –

6

El problema principal en su problema se produce cuando un hilo User quiere colocar un Dish sucio en un lavavajillas por lo demás limpio.

La solución es simple. Cree otro objeto Dishwasher.

Uno Dishwasher sostiene los platos sucios, a la espera de limpiarlos, y el otro sostiene los platos recién lavados.

Cuando el Dishwasher sosteniendo los platos limpios está vacío, comience a limpiar los platos sucios en el otro Dishwasher.

En este punto, los hilos User ahora pueden poner los platos sucios en lo que solía ser el Dishwasher limpio (que ahora está vacío).

Continúa alternando los roles de los dos Dishwashers indefinidamente. User hilos siempre pueden dejar un plato sucio sin la necesidad de un KitchenCounterBuffer.

Nota: Esta solución no soluciona el problema de falta de la taza. User hilos todavía pueden bloquear la espera de un lavavajillas para terminar la limpieza.

Nota 2: En entornos restringidos donde Dishwasher es un singleton, proporcionar un KitchenCounterBuffer, así como un DishwasherOperator para quitar de platos y colocar los platos sucios de la KitchenCounterBuffer a la Dishwasher. El KitchenCounterBuffer toma el rol de Dishwasher sucio en el algoritmo anterior. Sin embargo, esto podría provocar que los hilos User arrojen excepciones o mueran.

+1

Sí ... ¡dos lavavajillas FTW! –

0

Una solución simple a esto es mantener invariantes que son siempre ciertas.Un ejemplo de un conjunto de invariantes de este tipo puede ser:

  • Si el lavavajillas está vacía/no completamente lleno - todos los platos están sucios
  • Si el lavavajillas está lleno - a continuación, todos los platos son limpios.

El objetivo del objeto que interactúa con el lavavajillas es mantener estas invariantes en orden. Si alguien agrega una taza al lavavajillas y la llena, también debe encenderla para que la siguiente persona que venga encuentre que el lavavajillas está lleno y que todas las tazas están limpias.

+0

Esto requiere que el lavavajillas se vacíe por completo cuando esté listo; no se puede quitar un solo plato limpio. –

+0

Las personas también tienen opiniones variables sobre qué es "completo" – user21714

2

No relacionado con la programación, pero puede ayudar a responder su pregunta lógica ... Mi lavavajillas tiene una luz "Limpia" que se enciende cuando ejecuta la lavadora. La luz permanece encendida si solo abre la puerta por un corto tiempo (es decir, saca una taza limpia) pero se apaga si mantiene la puerta abierta por un tiempo más prolongado (tiempo suficiente para vaciar la lavadora). No es perfecto, pero es mucho más confiable que una bandera en el frente que debe ser volteada por un humano (algo olvidadizo).

1

acaba de hacer una regla para eliminar siempre los platos limpios de la lavadora de platos, así que cualquier cosa que se encuentre en = sucio y se puede añadir más

+0

El problema es que el controlador de devolución de llamada onDoneWashing no siempre se implementa de forma confiable y, por lo tanto, no puede suponer que porque hay platos allí están sucios –

1

ver, este es el problema con el pensamiento de procedimiento. Convierte todo en un proceso por lotes, y eso no funciona bien en un mundo asincrónico impulsado por eventos. Debe comenzar a preocuparse por el estado, el enhebrado, las condiciones de carrera, la persistencia, etc.

Una solución que evita estos problemas sería hacer inmutables todos los platos. Si necesitas un plato sucio, simplemente crearías una nueva instancia con suciedad.

Si obtener una copia limpia de un plato era una operación común (que suena como el caso en su caso), podría agregar un método .AsClean() a su objeto Dish, que automáticamente devolvería un clon limpio para usted . Si el rendimiento se convirtió en un cuello de botella, esto podría optimizarse devolviendo this si la instancia ya estaba limpia.

Por supuesto, esto supone que se encuentra en un entorno con un espacio de montón razonable y una recolección de basura automática.

1

He visto lavaplatos comerciales que envían platos a través de un transportador a través de un túnel. Pones platos sucios en los estantes de la izquierda. Tomas platos limpios de los estantes a la derecha. El estado limpio/sucio de un plato individual corresponde a su ubicación física dentro de la máquina.

Esta es una arquitectura completamente diferente. Con un lavavajillas estándar, usted piensa en "limpio/sucio" como un atributo del lavavajillas. "Limpio" significa "no contiene platos sucios". Con el lavavajillas transportador, "limpio/sucio" no es un atributo del lavavajillas.

Puede que no desee cambiar a esta arquitectura, pero si lo hace, considere una serie de objetos de procesamiento conectados por colas de bloqueo simultáneas. Un plato entra en la pre-enjuagadora, sale, entra en la lavadora, sale, entra en la secadora y sale por el extremo.

0

¿Puede hacer que el lavavajillas expulse sus platos automáticamente, al final de su ciclo de lavado?

Esto es similar a la idea de Mark Lutton, y análoga a empujar los platos limpios a una cola (quizás temporal) de platos conocidos, de los cuales pueden ser quitados.

0

Es un problema de diseño debido al uso de una tecnología en descomposición. Al actualizar una parte de su diseño, a una forma más avanzada, puede deshacerse de todo el problema y ahorrar tiempo, agua y energía.

¿Usar placas comestibles?

Cuestiones relacionadas