C++ 阻塞/等待堆栈操作

C++ 阻塞/等待堆栈操作,c++,stack,C++,Stack,这是我在甲骨文公司的面试问题 存在一个堆栈,即使堆栈已满,推送操作也应等待完成,而pop操作应等待完成,即使堆栈为空 我们如何才能做到这一点 我的回答 让一个线程执行push&pop操作。推线程必须等待堆栈有一个空闲空间,而弹出线程必须等待堆栈至少有一个元素。两个信号灯?加载一个具有堆栈深度限制的“A”,创建另一个为空的“B”。每个想要推送值的线程都必须等待“a”中的一个单位,弹出该值,然后向“B”发送一个单位信号。每个想要弹出的线程都必须等待“B”中的一个单位,弹出该值,然后向“a”发送一个单

这是我在甲骨文公司的面试问题

存在一个堆栈,即使堆栈已满,推送操作也应等待完成,而pop操作应等待完成,即使堆栈为空

我们如何才能做到这一点

我的回答
让一个线程执行push&pop操作。推线程必须等待堆栈有一个空闲空间,而弹出线程必须等待堆栈至少有一个元素。

两个信号灯?加载一个具有堆栈深度限制的“A”,创建另一个为空的“B”。每个想要推送值的线程都必须等待“a”中的一个单位,弹出该值,然后向“B”发送一个单位信号。每个想要弹出的线程都必须等待“B”中的一个单位,弹出该值,然后向“a”发送一个单位的信号


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

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

如果堆栈已满,推线程(执行推操作的线程)将执行阻塞推操作。因此,它会等待推送,直到堆栈剩下一个空间(直到发生弹出)


如果堆栈为空,pop线程(执行pop操作的线程)将执行阻塞pop操作。因此,它会等待弹出,直到堆栈中至少有一个元素(直到发生推送)。

您的答案很好,您应该将其作为自己的答案添加到问题中。标题令人困惑:您的操作正在阻塞并指定为阻塞。如果操作正在阻塞,那么它将无限继续,对吗?如果推送阻塞堆栈并等待弹出发生,它将无限期地继续。我说的对吗?通常,“阻塞”描述的是一种操作,它会阻塞执行线程,直到必要的资源(例如堆栈中的空间)可用为止。+1:他们问了一个教科书式的问题,你给出了简单的答案。如果他们要求你提供更多的细节,你可能已经了解了互斥体和条件,但是堆栈不能同时是满的和空的,对吗?正如thiton所说,阻塞不是死锁;-)我试图澄清一下标题。