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