Возможно, вы захотите рассмотреть свои требования - действительно ли это так, что А не может вообще отказаться от каких-либо элементов очереди? Или вы не хотите, чтобы B извлекал из очереди два последовательных элемента, из которых не поступали последовательные элементы, потому что это каким-то образом исказило бы последовательность событий?
Например, если это какая-то система регистрации данных, вы (по понятным причинам) не захотите пропусков в записи - но без неограниченной памяти реальность такова, что в каком-то угловом случае вы, вероятно, могли бы переполнить емкость очереди ..
В этом случае одним из решений является наличие какого-то особого элемента, который может быть помещен в очередь, что представляет собой случай, когда А обнаружил, что ему пришлось отбросить предметы. По сути, вы сохраняете один дополнительный элемент, который в большинстве случаев равен нулю. Каждый раз, когда A идет, чтобы добавить элементы в очередь, если этот дополнительный элемент не является нулевым, это входит. Если A обнаруживает, что в очереди нет места, тогда он настраивает этот дополнительный элемент, чтобы сказать: «эй, очередь была заполнена» .
Таким образом, A никогда не блокируется, вы можете отбрасывать элементы, когда система очень занята, но вы не упускаете из виду тот факт, что элементы были отброшены, потому что, как только пространство очереди становится доступным, эта метка входит в указать, где произошла потеря данных. Затем процесс B делает все, что ему нужно, когда он обнаруживает, что он вытянул этот элемент метки переполнения из очереди.