3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Introduction</title>
5 <link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
7 <link rel="home" href="../index.html" title="Chapter 1. Coroutine">
8 <link rel="up" href="../index.html" title="Chapter 1. Coroutine">
9 <link rel="prev" href="overview.html" title="Overview">
10 <link rel="next" href="motivation.html" title="Motivation">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="overview.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="motivation.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
27 <a name="coroutine.intro"></a><a class="link" href="intro.html" title="Introduction">Introduction</a>
28 </h2></div></div></div>
30 <a name="coroutine.intro.h0"></a>
31 <span class="phrase"><a name="coroutine.intro.definition"></a></span><a class="link" href="intro.html#coroutine.intro.definition">Definition</a>
34 In computer science routines are defined as a sequence of operations. The execution
35 of routines forms a parent-child relationship and the child terminates always
36 before the parent. Coroutines (the term was introduced by Melvin Conway <a href="#ftn.coroutine.intro.f0" class="footnote" name="coroutine.intro.f0"><sup class="footnote">[1]</sup></a>), are a generalization of routines (Donald Knuth <a href="#ftn.coroutine.intro.f1" class="footnote" name="coroutine.intro.f1"><sup class="footnote">[2]</sup></a>. The principal difference between coroutines and routines is that
37 a coroutine enables explicit suspend and resume of its progress via additional
38 operations by preserving execution state and thus provides an <span class="bold"><strong>enhanced
39 control flow</strong></span> (maintaining the execution context).
42 <a name="coroutine.intro.h1"></a>
43 <span class="phrase"><a name="coroutine.intro.how_it_works"></a></span><a class="link" href="intro.html#coroutine.intro.how_it_works">How
47 Functions foo() and bar() are supposed to alternate their execution (leave
48 and enter function body).
51 <span class="inlinemediaobject"><img src="../../../../../libs/coroutine/doc/images/foo_bar.png" align="middle" alt="foo_bar"></span>
54 If coroutines were called exactly like routines, the stack would grow with
55 every call and would never be popped. A jump into the middle of a coroutine
56 would not be possible, because the return address would be on top of stack
60 The solution is that each coroutine has its own stack and control-block (<span class="emphasis"><em>boost::contexts::fcontext_t</em></span>
61 from <span class="bold"><strong>Boost.Context</strong></span>). Before the coroutine
62 gets suspended, the non-volatile registers (including stack and instruction/program
63 pointer) of the currently active coroutine are stored in the coroutine's control-block.
64 The registers of the newly activated coroutine must be restored from its associated
65 control-block before it is resumed.
68 The context switch requires no system privileges and provides cooperative multitasking
69 convenient to C++. Coroutines provide quasi parallelism. When a program is
70 supposed to do several things at the same time, coroutines help to do this
71 much more simply and elegantly than with only a single flow of control. The
72 advantages can be seen particularly clearly with the use of a recursive function,
73 such as traversal of binary trees (see example 'same fringe').
76 <a name="coroutine.intro.h2"></a>
77 <span class="phrase"><a name="coroutine.intro.characteristics"></a></span><a class="link" href="intro.html#coroutine.intro.characteristics">characteristics</a>
80 Characteristics <a href="#ftn.coroutine.intro.f2" class="footnote" name="coroutine.intro.f2"><sup class="footnote">[3]</sup></a> of a coroutine are:
82 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
84 values of local data persist between successive calls (context switches)
87 execution is suspended as control leaves coroutine and is resumed at certain
91 symmetric or asymmetric control-transfer mechanism; see below
94 first-class object (can be passed as argument, returned by procedures,
95 stored in a data structure to be used later or freely manipulated by the
103 Coroutines are useful in simulation, artificial intelligence, concurrent programming,
104 text processing and data manipulation, supporting the implementation of components
105 such as cooperative tasks (fibers), iterators, generators, infinite lists,
109 <a name="coroutine.intro.h3"></a>
110 <span class="phrase"><a name="coroutine.intro.execution_transfer_mechanism"></a></span><a class="link" href="intro.html#coroutine.intro.execution_transfer_mechanism">execution-transfer
114 Two categories of coroutines exist: symmetric and asymmetric coroutines.
117 An asymmetric coroutine knows its invoker, using a special operation to implicitly
118 yield control specifically to its invoker. By contrast, all symmetric coroutines
119 are equivalent; one symmetric coroutine may pass control to any other symmetric
120 coroutine. Because of this, a symmetric coroutine <span class="emphasis"><em>must</em></span>
121 specify the coroutine to which it intends to yield control.
124 <span class="inlinemediaobject"><img src="../../../../../libs/coroutine/doc/images/foo_bar_seq.png" align="middle" alt="foo_bar_seq"></span>
127 Both concepts are equivalent and a fully-general coroutine library can provide
128 either symmetric or asymmetric coroutines. For convenience, Boost.Coroutine
132 <a name="coroutine.intro.h4"></a>
133 <span class="phrase"><a name="coroutine.intro.stackfulness"></a></span><a class="link" href="intro.html#coroutine.intro.stackfulness">stackfulness</a>
136 In contrast to a stackless coroutine a stackful coroutine can be suspended
137 from within a nested stackframe. Execution resumes at exactly the same point
138 in the code where it was suspended before. With a stackless coroutine, only
139 the top-level routine may be suspended. Any routine called by that top-level
140 routine may not itself suspend. This prohibits providing suspend/resume operations
141 in routines within a general-purpose library.
144 <a name="coroutine.intro.h5"></a>
145 <span class="phrase"><a name="coroutine.intro.first_class_continuation"></a></span><a class="link" href="intro.html#coroutine.intro.first_class_continuation">first-class
149 A first-class continuation can be passed as an argument, returned by a function
150 and stored in a data structure to be used later. In some implementations (for
151 instance C# <span class="emphasis"><em>yield</em></span>) the continuation can not be directly
152 accessed or directly manipulated.
155 Without stackfulness and first-class semantics, some useful execution control
156 flows cannot be supported (for instance cooperative multitasking or checkpointing).
158 <div class="footnotes">
159 <br><hr style="width:100; text-align:left;margin-left: 0">
160 <div id="ftn.coroutine.intro.f0" class="footnote"><p><a href="#coroutine.intro.f0" class="para"><sup class="para">[1] </sup></a>
161 Conway, Melvin E.. "Design of a Separable Transition-Diagram Compiler".
162 Commun. ACM, Volume 6 Issue 7, July 1963, Article No. 7
164 <div id="ftn.coroutine.intro.f1" class="footnote"><p><a href="#coroutine.intro.f1" class="para"><sup class="para">[2] </sup></a>
165 Knuth, Donald Ervin (1997). "Fundamental Algorithms. The Art of Computer
166 Programming 1", (3rd ed.)
168 <div id="ftn.coroutine.intro.f2" class="footnote"><p><a href="#coroutine.intro.f2" class="para"><sup class="para">[3] </sup></a>
169 Moura, Ana Lucia De and Ierusalimschy, Roberto. "Revisiting coroutines".
170 ACM Trans. Program. Lang. Syst., Volume 31 Issue 2, February 2009, Article
175 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
176 <td align="left"></td>
177 <td align="right"><div class="copyright-footer">Copyright © 2009 Oliver Kowalke<p>
178 Distributed under the Boost Software License, Version 1.0. (See accompanying
179 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
184 <div class="spirit-nav">
185 <a accesskey="p" href="overview.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.html"><img src="../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../index.html"><img src="../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="motivation.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>