Проблема ограниченного буфера: решение синхронизации производитель-потребитель с использованием семафоров

Проблема ограниченного буфера — это классическая задача синхронизации в информатике. Он предполагает координацию нескольких потоков или процессов, которые работают с общим буфером фиксированного размера, при этом одни потоки создают элементы данных, а другие их потребляют. Проблема заключается в том, чтобы гарантировать, что потоки-производители не пытаются создавать данные, когда буфер заполнен, а потоки-потребители не пытаются использовать данные, когда буфер пуст.

Одно из распространенных решений проблемы ограниченного буфера включает использование семафоров, которые представляют собой примитивы синхронизации, обеспечивающие механизм управления доступом к общим ресурсам.

Вот реализация проблемы ограниченного буфера с использованием семафоров в 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отслеживают пустой и занятый буфер. слоты в буфере соответственно.