Семафор – обобщение блокирующих переменных.
Это переменная, которая может принимать целые неотрицательные значения, предложена Дейкстра.
Если семафор может принимать значения только 0 и 1 – он превращается в блокирующую переменную.
Его удобно использовать для синхронизации набора идентичных ресурсов – например, отдельных буферов, с каждым из которых может работать отдельный поток. Они идеальны для решения задачи доступа к ресурсным пулам: информационным структурам, наборам одинаковых областей памяти, наборам внешних устройств.
Здесь у нас 2 семафора, один для количества пустых, второй – для количества занятых буферов.