Введение

Протопоток — это механизм с низкими накладными расходами для конкурентного программирования. Протопотоки функционируют как потоки или корутины без стека, обеспечивая недорогой блокирующий контекст, используя минимальный объем памяти на протопоток (порядка единиц байт). Протопотоки используются для реализации формы невытесняющей конкурентности, известной как кооперативная многозадачность, и, следовательно, не требуют переключения контекста при уступке управления другому потоку. Внутри протопотока уступка управления достигается с помощью конструкции Даффа в функции потока и внешней переменной, используемой в операторе switch. Это позволяет переходить (возобновлять выполнение) из точки уступки при очередном вызове функции. Для блокировки потоков эти уступки могут быть защищены условием, так что последовательные вызовы одной и той же функции будут приводить к уступке управления, пока условие защиты не станет истинным. Особенностью протопотоков по сравнению с другими реализациями корутин или полноценных потоков является отсутствие стека. Это имеет свои преимущества и недостатки. Недостатком является то, что нельзя полагаться на сохранение значений локальных переменных протопотока после уступки управления другому контексту. Они должны сохранять свое состояние с помощью статических или внешних, часто глобальных, переменных. Преимуществом является их малый вес, что делает их полезными в системах с сильно ограниченной памятью, таких как небольшие микроконтроллеры, где другие решения непрактичны или менее предпочтительны. Том Дафф, автор конструкции Даффа, так отозвался о недостатках этого метода: «Существует похожий трюк для автоматов с конечными состояниями, управляемых прерываниями, который слишком сложен для описания. [ ] Я никогда не считал это адекватной реализацией корутин общего назначения, поскольку сложно иметь несколько одновременных активаций корутины, и невозможно, используя этот метод, чтобы корутины могли уступить управление где-либо, кроме как в своей основной процедуре. Простая библиотека переключения стеков на языке ассемблера позволяет делать и то, и другое». Концепция протопотока была разработана Адамом Данкельсом и Оливером Шмидтом на основе предыдущих работ Саймона Татама и Тома Даффа.