7.3. ЛОГИЧЕСКАЯ СТРУКТУРА ЦИКЛА
339
Потоки — это один из наиболее важных видов ресурсов, совместно ис-
пользуемых сопрограммами.С их помощью реализуется часто применяемый
на практике механизм буферизации. Идея механизма буферизации в том, что
разделяемый несколькими процессами ресурс «прокачивается» через буфер
(очередь, поток, иную структуру данных), пополняемый процессами-произ-
водителями, и опустошаемый процессами-потребителями (см. рис. 7.1, часть
б). В этом случае производители могут генерировать элементы, не дожидаясь
запросов потребителей.
Нужно отметить, что буферизация полезна, прежде всего, как логическое
средство и только во вторую очередь как средство распараллеливания работ.
Причем последнее вовсе не обязательно!
Буфер может иметь фиксированные размеры, и тогда его заполненность
приводит к невозможности (к блокировке) работы производителей до тех
пор, пока потребители не очистят его. В вырожденном случае, когда длина
буфера не может превышать единицы, буферизация фактически отсутству-
ет, и применимы схемы согласования 2–4. Для асинхронного случая к ним
добавляются схемы использования средств управления параллельными вы-
числениями: операторы синхронизации, ожидания и т. п. В случае неогра-
ниченного буфера становится возможной и схема 1, но, как уже отмечалось,
фактически это отсутствие взаимодействия.
Имеются виды буферизации, которая базируется не на потоковом извле-
чении данных. Заполнение буфера — генерация потока, но извлечение дан-
ных может быть организовано не только как очередь, но и как стек, и как
множество (когда порядок извлечения непринципиален). Выбор типа буфера
обусловливается особенностями решаемой задачи.
Рекомендуем посмотреть пример в § 8.6.3, в котором активно использу-
ется буферизация в виде линии задержки.
Все рассмотренные выше виды буферизации представляют собой пассив-
ную буферизацию,т. е. такую,которая не участвует в выполнении существен-
ных функций производителей и потребителей данных, а используется лишь
для хранения. Наряду с ней употребительна и активная буферизация, когда
с хранением совмещается ряд других функций. К примеру, если для обработ-
ки требуется только часть данных некоторого потока, то можно организовать
фильтр для отбора нужных данных перед помещением их в буфер либо перед
извлечением их. Этот прием можно усмотреть в решении задачи о простых
числах, если считать хранилище уже найденных чисел буфером. Легко заме-
тить, что фильтрация перед сохранением данных в таком случае зависит от
свойств уже накопленного материала (числа, кратные уже запомненным про-