Уловка, которую я использую в сложных ситуациях, - добавление флага «не рекомендуется» к элементам в стеке.
Когда я хочу «удалить» элемент, я просто поднимаю этот флаг (и очищаю все ресурсы, которые получает объект).
Затем при всплывающих элементах я просто проверяю, установлен ли флаг, и снова всплываю в цикле, пока не будет найден объект, не подлежащий устареванию.
do
{
obj = mQueue.Pop();
} while (obj.deprecated);
Вы можете управлять своим собственным количеством элементов, чтобы узнать, сколько «реальных» элементов все еще находится в очереди, и, очевидно, следует использовать блокировку, если это требуется для многопоточного решения.
Я обнаружил, что для очередей, которые имеют постоянный поток через них - элементы перемещаются и выталкиваются - гораздо эффективнее обрабатывать его таким образом, это самое быстрое, что вы можете получить (заплатив O (1) за удаление элемента из середины) и память, если объект, который сохраняется, маленький, это в основном не имеет значения, если элементы текут в разумном темпе.