Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Introduction

Boost , Chapter 1. Coroutine2 , Chapter 1. Coroutine2

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Definition

В информатике рутины определяются как последовательность операций. Выполнение рутины формирует отношения между родителем и ребенком, и ребенок прекращается всегда перед родителем. Корутины (термин был введен Мелвином Конвеем [1]), являются обобщением рутин (Дональд Кнут [2]). Основное различие между корутинами и рутинами заключается в том, что корутин позволяет явно приостановить и возобновить свой прогресс с помощью дополнительных операций, сохраняя состояние исполнения и, таким образом, обеспечивает расширенный поток управления (поддержание контекста исполнения).

How it works

Функции foo() и bar() должны чередовать свое исполнение (уходить и входить в функциональное тело).

foo_bar

Если бы корутины назывались точно так же, как рутины, стек рос бы с каждым звонком и никогда бы не лопнул. Скачок в середину корутина невозможен, потому что обратный адрес будет поверх записей стека.

Решение состоит в том, что каждый корутин имеет свой собственный стек и блок управления (boost::contexts::fcontext_t из Boost.Context). До приостановки работы корутина энергонезависимые регистры (включая стек и указатель инструкции/программы) действующего корутина хранятся в блоке управления корутина. Регистры вновь активированного корутина должны быть восстановлены из соответствующего контрольного блока до его возобновления.

Переключатель контекста не требует системных привилегий и обеспечивает удобную для C++ совместную многозадачность. Корутина обеспечивает квазипараллельность. Когда программа должна делать несколько вещей одновременно, корутин помогает сделать это гораздо проще и изящнее, чем при одном потоке управления. Преимущества можно увидеть особенно четко с использованием рекурсивной функции, такой как обход двоичных деревьев (см. пример «та же бахрома»).

characteristics

Характеристики [3] корутина:

  • значения локальных данных сохраняются между последовательными вызовами (переключателями)
  • исполнение приостанавливается, поскольку контроль покидает корутин и возобновляется в определенное время позже
  • симметричный или асимметричный механизм передачи управления; см. ниже
  • объект первого класса (может быть передан в качестве аргумента, возвращен процедурами, сохранен в структуре данных для последующего использования или свободно манипулировать разработчиком)
  • сложенный или без стека

Корутины полезны в симуляции, искусственном интеллекте, параллельном программировании, обработке текста и манипулировании данными, поддерживая реализацию таких компонентов, как совместные задачи (волокна), итераторы, генераторы, бесконечные списки, трубы и т. Д.

execution-transfer mechanism

Существуют две категории корутин: симметричные и асимметричные.

Асимметричный корутин знает своего инициатора, используя специальную операцию, чтобы неявно передать контроль именно своему инициатору. Напротив, все симметричные корутины эквивалентны; один симметричный корутин может передавать управление любому другому симметричному корутину. Из-за этого симметричный корутин должен указывать корутин, которому он намерен дать контроль.

foo_bar_seq

Оба понятия эквивалентны, и полностью общая библиотека может обеспечить либо симметричные, либо асимметричные координаты.

stackfulness

В отличие от стекового корутина, стековый корутин может быть приостановлен внутри вложенного стекфрейма. Исполнение возобновляется в том же месте кода, где оно было приостановлено ранее. При бескомпактной рутине может быть приостановлена только рутина верхнего уровня. Любая рутина, называемая этой рутиной высшего уровня, сама по себе не может быть приостановлена. Это запрещает приостановку/возобновление операций в рутине в библиотеке общего назначения.

first-class continuation

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

Без укладки и первоклассной семантики некоторые полезные потоки управления исполнением не могут поддерживаться (например, совместная многозадачность или контрольно-пропускной пункт).



[1] Конвей, Мелвин Э. «Дизайн отдельного компилятора переходных диаграмм». Commun. ACM, Volume 6 Issue 7, July 1963, Article No

[2] Кнут, Дональд Эрвин (1997). "Основные алгоритмы. The Art of Computer Programming 1», (3rd ed.)

[3] Моура, Ана Люсия Де и Иерусалимский, Роберто. "Возвращение к корутине". АСМ Транс. Программа. Lang. Syst., Volume 31 Issue 2, February 2009, Article No. 6


PrevUpHomeNext

Статья Introduction раздела Chapter 1. Coroutine2 Chapter 1. Coroutine2 может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Chapter 1. Coroutine2 ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 21:04:21/0.0076639652252197/0