阻止/等待堆栈操作

时间:2011-12-28 15:26:32

标签: c++ stack

这是甲骨文给我的一个面试问题。

有一个堆栈和一个push操作应该等到它完成,即使堆栈已满并且pop操作应该等到它完成,即使堆栈是空的。

我们如何实现这一目标?

我的回答

让一个线程做推送&流行操作。推送线程必须等到堆栈有空余空间,并且pop线程必须等到堆栈至少有一个元素。

2 个答案:

答案 0 :(得分:1)

两个信号量?加载一个'A',堆栈深度限制,创建另一个,'B'为空。每个想要推送值的线程必须等待来自'A'的单位,弹出该值然后将单位发信号给'B'。每个想要弹出的线程都必须等待'B'中的一个单元,弹出该值然后将一个单元发送到'A'。

如果堆栈不是线程安全的,那么您还需要一个互斥/关键部分来保护堆栈免受多次访问。

答案 1 :(得分:0)

通过让线程执行此任务可以实现阻塞/等待堆栈操作。

如果堆栈已满,则推送线程(执行推送操作的线程)进行阻塞推送操作。所以它等待直到堆栈剩余空间(直到发生流行)。

如果堆栈为空,则弹出线程(执行弹出操作的线程)进行阻塞弹出操作。所以它等待弹出直到堆栈至少有一个元素(直到推送发生)。