Блокировка / ожидание операций стека - PullRequest
3 голосов
/ 28 декабря 2011

Это был вопрос для меня в Oracle.

Существует стек, и операция push должна ждать, пока он не завершится, даже если стек заполнен, а операция pop должна ждать, пока не завершится, даже еслистек пуст.

Как этого достичь?

Мой ответ

Пусть поток выполняет операцию push & pop.Push-поток должен ждать, пока в стеке не будет свободного места, а pop-поток должен ждать, пока в стеке будет хотя бы один элемент.

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

Два семафора? Загрузите один, 'A', с пределом глубины стека, создайте другой, 'B', пустым. Каждый поток, который хочет выдвинуть значение, должен ждать единицы от «A», вытолкнуть значение и затем подать сигнал единице на «B». Каждый поток, который хочет выдвинуться, должен ждать единицы от 'B', вытолкнуть значение и затем сигнализировать единицу на 'A'.

Если стек не является поточно-ориентированным, вам потребуется также мьютекс / критическая секция для защиты стека от множественного доступа.

0 голосов
/ 28 декабря 2011

Блокирование / ожидание операции стека может быть достигнуто с помощью потока, выполняющего эту задачу.

Если стек заполнен, выталкивающая нить (нить, выполняющая операцию выталкивания) выполняет блокирующую операцию выталкивания.Таким образом, он ожидает нажатия, пока в стеке не останется свободного места (до появления pop).

Если стек пустой, поток pop (поток, выполняющий операцию pop) выполняет блокирующую операцию pop.Таким образом, он ожидает появления, пока в стеке не будет хотя бы одного элемента (пока не произойдет нажатие).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...