避免花很长时间来完成“牛奶过多”的场景

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 部分锁定,那么您就设置好了。与出去买牛奶相比,留下便条的时间非常短。

【讨论】:

以上是关于避免花很长时间来完成“牛奶过多”的场景的主要内容,如果未能解决你的问题,请参考以下文章

如何避免阻塞(C++、Win32)

为啥 SQLite 需要这么长时间来获取数据?

Android MediaPlayer 需要很长时间来准备和缓冲

Linq 更新需要很长时间来处理

为啥存储过程要花很长时间才能执行,但过程中的代码自己运行得很快?

PLSQL 块需要很长时间来声明游标