这是甲骨文给我的一个面试问题。
有一个堆栈和一个push操作应该等到它完成,即使堆栈已满并且pop操作应该等到它完成,即使堆栈是空的。
我们如何实现这一目标?
让一个线程做推送&流行操作。推送线程必须等到堆栈有空余空间,并且pop线程必须等到堆栈至少有一个元素。
答案 0 :(得分:1)
两个信号量?加载一个'A',堆栈深度限制,创建另一个,'B'为空。每个想要推送值的线程必须等待来自'A'的单位,弹出该值然后将单位发信号给'B'。每个想要弹出的线程都必须等待'B'中的一个单元,弹出该值然后将一个单元发送到'A'。
如果堆栈不是线程安全的,那么您还需要一个互斥/关键部分来保护堆栈免受多次访问。
答案 1 :(得分:0)
通过让线程执行此任务可以实现阻塞/等待堆栈操作。
如果堆栈已满,则推送线程(执行推送操作的线程)进行阻塞推送操作。所以它等待直到堆栈剩余空间(直到发生流行)。
如果堆栈为空,则弹出线程(执行弹出操作的线程)进行阻塞弹出操作。所以它等待弹出直到堆栈至少有一个元素(直到推送发生)。