避免花很长时间来完成“牛奶过多”的场景
Posted
技术标签:
【中文标题】避免花很长时间来完成“牛奶过多”的场景【英文标题】:Avoid taking a long time to finish the 'too much milk' scenario 【发布时间】:2019-01-06 03:57:11 【问题描述】:以下是“牛奶过多问题”的简单解决方案
lock mutex;
while (1)
lock_acquire(mutex);
if (no milk)
go and buy milk;//action-1
lock_release(mutex);
问题在于,action-1 可能需要很长时间才能完成,使得任何等待获取互斥锁的进程都等待很长时间。
避免这种情况的一种方法是设置一个计时器,这样一旦计时器关闭,购买牛奶的流程就会返回有或没有牛奶。如您所见,这样做存在问题。 (例如:无法确定进程是否已经买了牛奶并在回家的路上)
有没有更好的解决方案?
编辑:The Too Much Milk Problem
【问题讨论】:
我的印象是,这是一个众所周知的问题,就像哲学家就餐的问题一样。我包含了一个解释它的链接 我认为您正在寻找条件变量。您需要解锁互斥锁,并且希望其他进入的线程等待“去喝牛奶”的线程。您链接的论文似乎可以解释一切。 【参考方案1】:现实生活中的解决办法是留下一张便条,说你出去买牛奶了。
现在,在编程中,这并不能完全解决问题,只是降低了竞争条件的风险,因为 Jack 和 Jill 都会在冰箱空了的时候看一眼,然后都留下便条。但是,如果您将 leave-note-if-no-milk-and-no-note 部分锁定,那么您就设置好了。与出去买牛奶相比,留下便条的时间非常短。
【讨论】:
以上是关于避免花很长时间来完成“牛奶过多”的场景的主要内容,如果未能解决你的问题,请参考以下文章
Android MediaPlayer 需要很长时间来准备和缓冲