Как реализовать изменяемую очередь?

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

Мне нужна в первую очередь очередь, в которой каждый элемент очереди добавляется производителем. Работа над элементами очереди должна быть синхронной (за один раз можно обрабатывать только один элемент). Тем не менее, элементы являются временными. Когда производитель переходит к добавлению работы в очередь, если очередь уже имеет работу, добавленную этим производителем, элемент очереди истекает и вместо того, чтобы удалять его из очереди, элемент заменяется на новый элемент производителя, поскольку я не хочу, чтобы чтобы потерять свою позицию в очереди.

Таким образом, правила очереди:

  1. Элементы, вытаскиваемые из очереди, по одному. Это достаточно просто, это очередь в конце концов...

  2. Элементы могут быть добавлены в очередь несколькими производителями одновременно.

  3. Если у производителя уже есть элемент в очереди, элемент очереди заменяется на новый элемент производителя.

  4. Элементы не могут быть вытащены из очереди, пока элемент добавляется в очередь (это значит, что элементы, которые изменяются, нельзя вытащить до тех пор, пока они не будут изменены)

  5. Производителям необязательно нужно иметь предметы в очереди, каждый продюсер может продлить промежутки времени без каких-либо работ.

Будем очень благодарны за любые идеи о том, как такая структура может быть реализована, или о существующей структуре данных, которая соответствует потребностям!

1 ответ

  1. Используйте класс BlockingCollection . Он позволяет одному потоку извлекать элементы по одному с помощью метода GetConsumingEnumerable Method и нескольких производителей для добавления элементов с помощью метода добавления.

  2. Когда производитель создает новый элемент, не добавляйте элемент в очередь, а сам производитель. Пусть продюсер вспомнит последний предмет, который он произвел. Если производитель уже находится в очереди, не добавляйте его второй раз.

  3. Потребитель отзывает производителя и запрашивает его для последнего товара в производстве. Если продюсер выпустил несколько элементов за это время, он запомнит только последний, и все предыдущие будут пропущены.

licensed under cc by-sa 3.0 with attribution.