В чем разница между асимметричными и симметричными корутинами?

Я заметил, что поддержка симметричной сопрограммы был удален в толчок.Coroutine2 для C++, поэтому я хотел понять - в чем разница между ними?

2 ответов


разница между симметричными и асимметричными корутинами особенно хорошо описана Ана Лусия де Мура и Роберто Иерусалимский в их статье"Revisiting Coroutines":

известная классификация сопрограммы касается контроля-передачи работ, которые предоставляются и различает понятия симметричного и асимметричная coroutines. Симметричные объекты coroutine обеспечивают одиночное контроль-передача в эксплуатацию, что позволяет сопрограммы для явной передачи управления между собой. Асимметричные механизмы корутина (чаще обозначаются как полу-симметричного или semi coroutines) обеспечивают две операции передачи управления: одну для вызова корутины и одну для ее приостановки, последняя возвращает управление вызывающему корутину. Хотя симметричные корутины работают на одном иерархическом уровне, асимметричная корутина может рассматриваться как подчиненная его вызывающий, отношения между ними несколько похожи на отношения между вызываемым и вызывающей процедурой.

Coroutine для поддержки параллельного программирования обычно предоставляют симметричные корутини для представления независимых единиц выполнения, как в Modula-2. С другой стороны, корутиновые механизмы, предназначенные для реализации конструкций, которые производят последовательности значений, обычно обеспечивают асимметричные корутины. Примеры этого типа конструкции итераторы и генераторы.

(цитаты опущены)

в асимметричной модели сопрограмма, "асимметрия" ссылается на то, что есть стек вызывающего абонента связь между сопрограммами. Корутина может либо вызвать другую корутину, либо приостановить себя, уступив управление вызывающему объекту, как правило, также давая значение вызывающему объекту в то же время.

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

обе модели фактически имеют такую же выразительную силу, т. е. асимметричное сопрограмм может быть реализована с использованием симметричного сопрограммы и наоборот. (См.симметричные сопрограммы, написанной Джованни П. Deretta, для преобразования между двумя типами сопрограммы.) Следовательно, Moura и Ierusalimschy пишут: "предоставление обеих конструкций только усложняет семантику механизма [coroutine], без увеличения в своей выразительной силе."

разработчики Coroutine2 решили не предоставлять симметричные корутины в библиотеке, потому что они считают, что симметричная функциональность корутина лучше реализована boost::context::execution_context (часть Boost.Контекст):http://lists.boost.org/Archives/boost/2015/06/223701.php


Coroutines переключаются между вызывающим и вызываемым, например, вы вводите функцию corotuine и переключаетесь обратно на вызывающий код. Обычно (асимметричные) корутины имеют две функции для этой цели:

  • функция resume, вызываемая вызывающим абонентом
  • функция suspend, которая вызывается из coroutine

поскольку у вас есть две функции для переключения контекста, он называется асимметричным. Симметричные корутины имеют только один функция, которая приостанавливает текущий контекст и возобновляет другой. Обратите внимание, что вы должны указать, какая симметричная корутина должна быть возобновлена следующей.

симметричные сопрограммы может использоваться для реализации потоков user-land (симметричная корутина представляет поток userland; планировщик переходит от одной к следующей симметрической корутине, например, следующий поток user-land запланирован)более эффективно чем asymmtric сопрограммы. Это очевидно, потому что симметрично coroutines не нужно возвращаться к вызывающему абоненту, чтобы возобновить следующий поток пользовательской земли. асимметричным корутинам нужно больше переключателей контекста чем симметричные сопрограммы для того, чтобы достичь той же функциональности.

симметричные сорулины-симметричное переключение контекста-лучше представлены такими понятиями, как'вызов с текущим продолжением' (Схема, Рубин ...). повышение.контекст поддерживает эту концепцию с ее реализацией callcc()/продолжение. Поэтому повышайте.coroutine2 не предоставляет симметричный API-интерфейс coroutine, Но асимметричный интерфейс boost.coroutine2 реализован с boost.контекст callcc()/продолжение.