2009-04-22 2 views
9

Я ищу алгоритм для применения к проблеме «посудомоечная машина на работе».Ищете решение для «Посудомоечная машина на рабочем месте»

Хотя это здорово, что вы можете положить в него грязные кофейные чашки и т. Д., Вы быстро натыкаетесь на «что такое состояние блюд?». дилемма. Если вы подходите к кухне, можете ли вы взять посуду из посудомоечной машины, потому что они чисты и просто не убраны? Можете ли вы поместить грязное блюдо в посудомоечную машину или это сделает недействительными чистые блюда?

Это похоже на проблему, которая должна иметь эквивалент программирования. У вас есть общий процесс, который запускается асинхронно и перемещает объекты из одного состояния в другое. Вы должны знать состояние объектов в любой момент времени. Какие алгоритмы могут быть применены?

Мой стартовый вариант - создать флип-флаг на посудомоечной машине «чистый» и «грязный». Когда посудомоечная машина опустошена, ее необходимо переключить на «грязную», когда она запускается, ее необходимо переключить на «чистку». Существуют ли проблемы с этим алгоритмом? Есть ли лучшая/менее подверженная ошибкам ошибка?

Примечание: Неты алгоритмы, которые используют расписание опроса, пожалуйста ...

+0

Вы должны попробовать взять жизнь проще :-))) Хорошая точка, хотя..Очень !! оригинал – Blerta

+1

Не только это работает, кто-то избил нас на деньги ... http://www.amazon.com/Clean-Dirty-Dishwasher-Indicator-255/dp/B00004XSF9 –

ответ

1

Я предполагаю, что все объекты в посудомоечной машине, должны быть чистыми или грязными, но не смешивать и сочетать. Нижеприведенное решение защищает это свойство. Если нет, то аналогия была не совсем правильной.

Всего несколько мьютексов должны делать трюк.

У вас есть четыре состояния.

  • Посудомоечная машина пустая, вы можете положить грязную посуду
  • Посудомоечная машина грязная, вы можете положить грязную посуду
  • Посудомоечная машина работает, вы не можете положить грязную посуду или удалить чистыми.
  • Посудомоечная машина чистая, вы не можете положить грязные блюда и удалить чистые.

Вы также можете свернуть пустые и грязные вместе, так как вас не волнует разница.

  • Когда вы хотите вставить что-то, вы будете ждать на DirtyMutex
  • Если вы хотите, чтобы начать стирку, вы будете ждать на DirtyMutex, так что вам не придется тратить воду;)
  • При стирке закончилась, вы сигнализировать CleanMutex
  • Если вы хотите очистить посудомоечную машину, вы будете ждать на CleanMutex
  • Когда посудомоечная машина пуста, то сигнал DirtyMutex

Это предполагает, что вы можете знать, когда посудомоечная машина пуста, если нет, вам понадобится счетный семафор для ElementsInDishwasher, который вы ждете, прежде чем сигнализировать DirtyMutex.

+0

Наличие очереди людей, ожидающих, что посудомоечная машина завершит чистку, вряд ли станет решением. –

+0

Ну, я не уверен, что понимаю это с точки зрения вычислительной техники. Если они хотят сделать что-то еще, им нужно опросить, нет решения. Каждый «человек может закрутить ожидающий поток» и установить значение, как только это будет сделано, если они захотят опросить внутренне. – jfclavette

+0

Использование двух разных мьютексов для одного ресурса является рискованным - вы зависите от всех вызывающих абонентов, чтобы следовать сложному протоколу. Почему не один мьютекс, который защищает флаг из четырех государств? (Также см. Мой ответ, опубликованный сразу после вашего.) –

1

Мне нравится ваша аналогия, но основная проблема меня беспокоит. По моему опыту, хорошо продуманная система всегда знает (как правило, неявно) тип состояния, о котором вы говорите. Например, ресурс в общей очереди ресурсов доступен для использования другими процессами - если бы он не был, он не был бы в очереди.Или ресурс, модифицированный рабочим потоком, находится в любом состоянии, в котором обрабатывается поток, - что более важно, ни один другой поток не нуждается в, чтобы узнать, является ли он «чистым» или «грязным».

Существует множество умопомрачительных шаблонов дизайна, которые я не встречал (или изобрел :-), но то, что вы описываете, имеет намек на дизайн запаха (или грязные блюда), а не действительный шаблон.

0

Вам нужен только один флаг, как вы указали (чистый/грязный). Посудомоечные машины обычно предоставляют этот механизм уже: (физический) замок.

  • Посудомоечная машина начинает пустой, разблокирован
  • Посудомоечная машина разблокируется, так грязная посуда может быть введен в нее
  • Перед запуском посудомоечной машины, она заблокирована
  • После запуска, он по-прежнему заблокирован, что указывает на все внутри загрязнен
  • Если удалить что-то из него, и это не последний пункт, вы блокироваться его

в программном Санс e, замок предназначен только для того, чтобы вставлять посуду в посудомоечную машину - вы знаете, что очищаемое блюдо чистое или грязное в зависимости от того, заблокировано оно или нет, но может только поставить блюдо, если оно разблокировано. Если вы возьмете последнее блюдо, вы его разблокируете.

+0

Откуда вы знаете, когда посудомоечная машина закончена? –

+0

Я предполагаю, что вы знаете, есть ли в данный момент посудомоечная машина или нет («если вы войдете в кухню, вы ее услышите»), и настоящая проблема заключается в том, чтобы знать, в каком состоянии находятся посуды, когда стиральная машина выключена. Очевидно, что состояние вещей происходит, когда шайба включена. –

6

Основная проблема в вашей проблеме возникает, когда нить User хочет поместить грязную Dish в чистую посудомоечную машину.

Решение прост. Создайте еще один объект Dishwasher.

Один Dishwasher содержит грязные блюда, ожидающие их очистки, а другой содержит недавно очищенные блюда.

Когда Dishwasher с чистыми блюдами пуст, начните чистку грязных блюд в другом Dishwasher.

На данный момент нитки теперь могут помещать грязные блюда в то, что раньше было чистым Dishwasher (который теперь пуст).

Продолжить чередование ролей двух Dishwashers на неопределенное время. User нити могут всегда падать с грязного блюда без необходимости KitchenCounterBuffer.

Примечание: Это решение не решает проблему голодания в чаше. User потоки все еще могут блокироваться в ожидании посудомоечной машины для завершения очистки.

Примечание2: В стесненных условиях, где Dishwasher одноэлементно, обеспечивают KitchenCounterBuffer, а также DishwasherOperator убрать посуду и поставить грязную посуду из KitchenCounterBuffer в Dishwasher. Затем KitchenCounterBuffer выполняет роль грязного Dishwasher в алгоритме выше. Однако это может привести к тому, что потоки User будут выдавать исключения или умирать.

+1

Да ... две посудомоечные машины FTW! –

0

Простым решением этого является поддержание неизменных инвариантов.Пример такого набора инвариантов может быть:

  • Если машина пуста/не полностью заполнена - все блюда грязные
  • Если посудомоечная машина полностью заряжена - тогда все блюда чистые.

Это задача объекта, который взаимодействует с посудомоечной машиной, чтобы поддерживать эти инварианты в порядке. Если кто-то добавит чашку в посудомоечную машину и сделает ее полной, он также должен включить ее, чтобы следующий человек, который приходит, обнаружил, что посудомоечная машина заполнена, а все чашки чисты.

+0

Для этого необходимо, чтобы посудомоечная машина была полностью опорожнена, когда это было сделано - вы не можете просто удалить одно чистое блюдо. –

+0

Люди также имеют разные мнения о том, что «полный» – user21714

2

Не связано с программированием, но это может помочь ответить на ваш логический вопрос ... Моя посудомоечная машина имеет «чистый» свет, который включается, когда вы запускаете стиральную машину. Свет остается, если вы просто открываете дверь на короткое время (т. Е. Вынимаете чистую чашку), но гаснет, если вы держите дверь открытой в течение более длительного времени (достаточно времени, чтобы опорожнить шайбу.) Это не идеально, но он намного надежнее, чем флаг на фронте, который должен быть перевернут человеком (несколько забывчивым).

1

просто создать правило, чтобы всегда удалить чистые блюда из посудомоечной машины, так что все, что есть в = грязном, и вы можете добавить больше

+0

Проблема в том, что обработчик обратного вызова onDoneWashing не всегда надежно реализуется, и поэтому вы не можете предположить, что, поскольку в нем есть блюда, они грязные –

1

Посмотреть, это проблема с процедурным мышлением. Это превращает все в пакетный процесс, и это не очень хорошо работает в асинхронном, управляемом событиями мире. Вам нужно начать беспокоиться о состоянии, резьбе, условиях гонки, сохранении и т. Д.

Решение, позволяющее избежать этих проблем, было бы сделать все блюда неизменными. Если вам нужно грязное блюдо, вы просто создадите новый экземпляр с грязью.

Если вы получили чистую копию блюда, это была обычная операция (которая звучит как случай в вашей ситуации), вы можете добавить метод .AsClean() к вашему объекту Dish, который автоматически возвращает чистый клон для вас , Если производительность стала узким местом, это можно было бы оптимизировать, вернув this, если экземпляр был уже чистым.

Конечно, это предполагает, что вы находитесь в среде с разумным пространством кучи и автоматической сборкой мусора.

1

Я видел коммерческие посудомоечные машины, которые отправляют посуду на конвейер через туннель. Вы кладете грязные блюда в стойки слева. Вы берете чистые блюда из стойки справа. Чистое/грязное состояние индивидуального блюда соответствует его физическому расположению внутри машины.

Это совершенно другая архитектура. Со стандартной посудомоечной машиной вы считаете «чистым/грязным» как атрибут посудомоечной машины. «Чистый» означает «не содержит грязных блюд». С конвейерной посудомоечной машиной «чистая/грязная» не является признаком посудомоечной машины.

Возможно, вам не захочется переключаться на эту архитектуру, но если вы это сделаете, рассмотрите ряд объектов обработки, связанных параллельными очередями блокировки. Блюдо входит в предварительный ополаскиватель, выходит, входит в шайбу, выходит, уходит в сушилку и выходит концом.

0

Можете ли вы, чтобы посудомоечная машина автоматически выбрасывала посуду в конце цикла мойки?

Это похоже на идею Марка Люттона, аналогичную тому, чтобы нажимать очищенные блюда на (возможно, временную) очередь известных блюд, из которых они могут быть удалены.

0

Это проблема дизайна, связанная с использованием разлагающейся технологии. Обновляя часть вашего дизайна, в более сложную форму, вы можете избавиться от всей проблемы и сэкономить время, воду и энергию.

Использовать съедобные тарелки?