Протопотік () — це механізм паралельного виконання з низькими накладними витратами.

Протопотоки функціонують як безстекові легкі потоки або співпрограми, забезпечуючи контекст блокування з мінімальними витратами пам'яті на кожен протопотік (порядку кількох байтів).

Протопотоки використовуються для реалізації невитискальної форми рівночасності, відомої як кооперативна багатозадачність, і тому не спричиняють перемикання контексту під час передавання керування іншому потоку. Усередині протопотоку передавання керування здійснюється за допомогою трюку Даффа у функції потоку та зовнішньої змінної, що використовується всередині оператора switch. Це дозволяє здійснювати перехід (відновлення виконання) після передавання керування під час наступного виклику функції. Для блокування потоків такі точки передавання керування можуть бути захищені умовною конструкцією, так що послідовні виклики тієї самої функції будуть передавати керування доти, доки умова захисту не стане істинною.

Особливістю протопотоків порівняно з іншими реалізаціями співпрограм або повноцінних потоків є те, що вони є безстековими. Це має як переваги, так і недоліки. Недоліком є те, що немає збереження значень локальних змінних усередині протопотоку після передавання керування іншому контексту. Для збереження стану необхідно використовувати статичні або зовнішні, часто глобальні, змінні.A. Dunkels, O. Schmidt, T. Voigt, and M. Ali, Protothreads: Simplifying Event-Driven Programming of Memory-Constrained Embedded Systems, Proc. ACM SenSys, Boulder, CO, USA, Nov 2006. (PDF, Presentation slides) Перевагою є те, що вони є дуже компактними і тому корисні в системах із жорсткими обмеженнями пам'яті, таких як малі мікроконтролери, де інші рішення є непрактичними або менш бажаними.

Том Дафф, відомий завдяки трюку Даффа, так висловився щодо недоліків цього методу: «подібний трюк для керованих перериваннями автоматів станів є надто жахливим, щоб про нього розповідати. [...] Я ніколи не вважав це адекватною реалізацією співпрограм загального призначення, оскільки непросто мати кілька одночасних активацій співпрограм, і за допомогою цього методу неможливо дозволити співпрограмам передавати керування будь-де, окрім їхньої процедури верхнього рівня. Проста бібліотека перемикання стеків мовою асемблера дозволяє робити і те, й інше».

Концепцію протопотоків розробили і Олівер Шмідт на основі попередніх робіт Саймона Тетема та Тома Даффа.

Див. також Співпрограма Мікропотік Віртуальний потік

Примітки

Посилання Protothread library in C викоримстовується Contiki Protothread library C++ Protothread