我正在寻找一种适用于“工作中的洗碗机”问题的算法。
虽然能够在其中放入脏咖啡杯等是很棒的,但您很快就会遇到“菜肴的状态是什么?”困境。如果您走到厨房,可以从洗碗机中取出餐具,因为它们是干净的,只是没有放好?您可以在洗碗机中放入脏盘子,还是会使其中的干净盘子无效?
这似乎是一个必须有一个编程等效的问题。你有一个异步触发的共享进程,并将对象从一个状态移动到另一个状态。您需要能够在任何给定时间知道对象的状态。可以应用哪些算
我的开始选项是在洗碗机上创建一个“干净”和“脏”的翻转标志。当洗碗机清空时,它必须切换到“脏”,当它运行时,它必须切换到“干净”。该算法有问题吗?
注意:没有使用轮询计划的算法,请...
当User
线程要将脏的Dish
放入其他清洁的洗碗机中时,问题中的主要问题就会发生。
解决方案很简单,创建另一个Dishwasher
对象。
一个Dishwasher
拿着脏盘子,等待清洗,另一个拿着最近清洗过的盘子。
当Dishwasher
拿着的干净碗碟是空的时,开始清洁其他Dishwasher
中的脏碗碟。
在这一点上,User
线程现在可以把脏盘子放在曾经是干净的Dishwasher
(现在是空的)。
继续无限期地交替两个Dishwashers
的角色。User
线程总是可以放下一个脏盘子,而不需要KitchenCounterBuffer
。
注意:此解决方案不能解决杯饥饿问题。User
线程仍可能阻塞等待洗碗机完成清洁。
注意 2:在Dishwasher
是单例的受限环境中,提供一个KitchenCounterBuffer
以及一个DishwasherOperator
来收起碗碟并将脏碗碟从KitchenCounterBuffer
放置到Dishwasher
。
与编程无关,但可能有助于回答您的逻辑问题...我的洗碗机在运行洗衣机时会亮起“清洁”灯。如果您只是短时间打开门(即取出干净的杯子),则该灯将保持点亮状态,但是如果您将门保持较长时间(有足够的时间清空洗衣机),则该灯将熄灭。它并不完美,但它比前面的旗帜要可靠得多。必须由一个人翻转(有点健忘)。
我假设洗碗机中的所有物体都必须干净或肮脏,但不能混合和匹配。的解决方案强制执行该属性。如果不是,你的类比不太正确。
只是几个互斥体应该做的伎俩。
你有四个州。
洗碗机空了,你可以把脏盘子
洗碗机脏了,你可以把脏盘子
洗碗机运行,你不能把脏盘子或删除干净的。
洗碗机干净,你不能把脏盘子,可以删除干净的。
你可以进一步崩溃空和脏在一起,因为你不关心的差异。
当你想插入的东西,你等待 DirtyMutex
当你想开始洗涤时,你在 DirtyMutex 上等待,这样你就不会浪费水;)
当洗涤结束时,你的信号 CleanMutex
当您要清空洗碗机时,请等待 CleanMutex
当洗碗机是空的,你的信号 DirtyMutex
这假设你可以知道洗碗机是空的,如果不是,你需要一个计数信号量 ElementsInDishwasher,你等待信号 DirtyMutex 之前。
我喜欢你的类比,但潜在的问题让我担心。根据我的经验,一个设计良好的系统总是知道 (通常是隐式地) 你所指的那种状态。例如,共享资源队列中的资源可供其他进程使用--如果不是,它就不会在队列中。或者,由工作线程修改的资源处于线程的处理说它处于的任何状态 b / '' '' '' '' '' '' '' '' ''
有一个令人难以置信的有效设计模式,我还没有遇到(或发明:-),但你所描述的有设计气味(或肮脏的菜肴)的暗示,而不是一个有效的模式。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(35条)