YaChudo

Протопотік

Переглядів: 0. Оновлено 25.10.2026.

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

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

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

Особливістю протопотоків порівняно з іншими реалізаціями співпрограм або повноцінних потоків є те, що вони є безстековими. Це має як переваги, так і недоліки. Недоліком є те, що немає збереження значень локальних змінних усередині протопотоку після передавання керування іншому контексту. Для збереження стану необхідно використовувати статичні або зовнішні, часто глобальні, змінні.[1] Перевагою є те, що вони є дуже компактними і тому корисні в системах із жорсткими обмеженнями пам'яті, таких як малі мікроконтролери, де інші рішення є непрактичними або менш бажаними.

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

Концепцію протопотоків розробили Адам Дункельс і Олівер Шмідт[3] на основі попередніх робіт Саймона Тетема[4] та Тома Даффа.[2]

Див. також

Примітки

  1. ↑ 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)
  2. ↑ а б Brainwagon » Coroutines in C.
  3. ↑ Adam Dunkels. Protothreads - Lightweight, Stackless Threads in C. Dunkels.com. Процитовано 21 квітня 2017.
  4. ↑ Coroutines in C.

Посилання

Джерело: стаття у Вікіпедії та історія редагувань (автори).