Мне нужна коллекция FIFO (аналогично очереди, с настраиваемой max size
), которая будет разделена между двумя потоками: writer
thread и reader
thread. writer
поместит sh элементов в эту коллекцию, а reader
будет читать их один за другим и работать с каждым из них (reader
читает следующий элемент только после того, как он завершит работу над текущим)
Если reader
недостаточно быстр и коллекция заполнена полностью (скажем, max size
равно 10, а в коллекции уже 10 элементов, в то время как reader
все еще занят работой над последним выбранным элементом), затем, когда writer
пытается добавить sh другой элемент в коллекцию, я хочу, чтобы он отбросил самый старый элемент из коллекции и pu sh новый. Я не хочу, чтобы он блокировался до тех пор, пока reader
не завершит работу над своим элементом и не выберет новый из коллекции для освобождения места, чтобы writer
мог добавить элемент.
What I ' Мы пытались использовать встроенные структуры, такие как Queue
и deque
, но ни одна из них не является именно тем, что мне нужно: Queue
блокирует put
, если вы указываете max length
, а deque
не блокирует pop
, он выдает исключение, если он пустой.
Так что мне в основном нужна структура данных, которая действует как Queue
get
и deque
put
с maxlen
.
Есть ли какой-нибудь хороший способ добиться того, что мне нужно? Я знаю, что такого рода структура данных может быть реализована с использованием Lock
-s и condition variable
-s, но если для этого есть что-то встроенное, лучше использовать ее напрямую.