start — эл-т, который нужно потребить. Изменяется только потребителем.
end — указатель на первую пустую ячейку. Изменяется только производителем.
При пустом и полном буфере start==end, нужно как-то отличить эти две ситуации.
- Флажок: 0 — буфер пуст, 1 — полон.
- Пуст — start=end=-1.
Появляется переменная, изменяемая обоими потоками.
Решение на семафорах:
Semaphore Full=0, Empty=N, Access=1;
Produce(el) {
P(Empty);
P(Access);
Добавить (el);
V(Access);
V(Full);
}
Consume (*el) {
P(Full);
P(Access);
*el=Извлечь();
V(Access);
V(Empty);
}
Недостаток семафоров и мьютексов в том, что их связь, защищаемая критическими ресурсами, установлена только в голове программиста. Соответственно, ОС не может автоматически контролировать использование семафоров и мьютексов.