Проблема ограниченного буфера — это классическая задача синхронизации в информатике. Он предполагает координацию нескольких потоков или процессов, которые работают с общим буфером фиксированного размера, при этом одни потоки создают элементы данных, а другие их потребляют. Проблема заключается в том, чтобы гарантировать, что потоки-производители не пытаются создавать данные, когда буфер заполнен, а потоки-потребители не пытаются использовать данные, когда буфер пуст.
Одно из распространенных решений проблемы ограниченного буфера включает использование семафоров, которые представляют собой примитивы синхронизации, обеспечивающие механизм управления доступом к общим ресурсам.
Вот реализация проблемы ограниченного буфера с использованием семафоров в Python:
from threading import Semaphore
class BoundedBuffer:
def __init__(self, size):
self.size = size
self.buffer = [None] * size
self.mutex = Semaphore(1) # Controls access to the buffer
self.empty = Semaphore(size) # Tracks the number of empty slots
self.full = Semaphore(0) # Tracks the number of occupied slots
def produce(self, item):
self.empty.acquire() # Wait until there's an empty slot
self.mutex.acquire() # Get exclusive access to the buffer
self.buffer.append(item)
self.mutex.release() # Release the buffer
self.full.release() # Increment the number of occupied slots
def consume(self):
self.full.acquire() # Wait until there's an occupied slot
self.mutex.acquire() # Get exclusive access to the buffer
item = self.buffer.pop(0)
self.mutex.release() # Release the buffer
self.empty.release() # Increment the number of empty slots
return item
В этом коде класс BoundedBufferпредставляет общий буфер. Метод produceиспользуется потоками-производителями для добавления элементов в буфер, а метод consumeиспользуется потоками-потребителями для удаления элементов из буфера. Семафор mutexгарантирует, что только один поток может получить доступ к буферу одновременно, а семафоры emptyи fullотслеживают пустой и занятый буфер. слоты в буфере соответственно.