• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<html>
2<head>
3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
4<title>Scheduling</title>
5<link rel="stylesheet" href="../../../../../doc/src/boostbook.css" type="text/css">
6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7<link rel="home" href="../index.html" title="Chapter 1. Fiber">
8<link rel="up" href="../index.html" title="Chapter 1. Fiber">
9<link rel="prev" href="fiber_mgmt/this_fiber.html" title="Namespace this_fiber">
10<link rel="next" href="stack.html" title="Stack allocation">
11</head>
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>
20</tr></table>
21<hr>
22<div class="spirit-nav">
23<a accesskey="p" href="fiber_mgmt/this_fiber.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="stack.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
24</div>
25<div class="section">
26<div class="titlepage"><div><div><h2 class="title" style="clear: both">
27<a name="fiber.scheduling"></a><a name="scheduling"></a><a class="link" href="scheduling.html" title="Scheduling">Scheduling</a>
28</h2></div></div></div>
29<p>
30      The fibers in a thread are coordinated by a fiber manager. Fibers trade control
31      cooperatively, rather than preemptively: the currently-running fiber retains
32      control until it invokes some operation that passes control to the manager.
33      Each time a fiber suspends (or yields), the fiber manager consults a scheduler
34      to determine which fiber will run next.
35    </p>
36<p>
37      <span class="bold"><strong>Boost.Fiber</strong></span> provides the fiber manager, but
38      the scheduler is a customization point. (See <a class="link" href="custom.html#custom">Customization</a>.)
39    </p>
40<p>
41      Each thread has its own scheduler. Different threads in a process may use different
42      schedulers. By default, <span class="bold"><strong>Boost.Fiber</strong></span> implicitly
43      instantiates <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a> as the scheduler for each thread.
44    </p>
45<p>
46      You are explicitly permitted to code your own <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> subclass.
47      For the most part, your <code class="computeroutput"><span class="identifier">algorithm</span></code>
48      subclass need not defend against cross-thread calls: the fiber manager intercepts
49      and defers such calls. Most <code class="computeroutput"><span class="identifier">algorithm</span></code>
50      methods are only ever directly called from the thread whose fibers it is managing
51      — with exceptions as documented below.
52    </p>
53<p>
54      Your <code class="computeroutput"><span class="identifier">algorithm</span></code> subclass is
55      engaged on a particular thread by calling <a class="link" href="fiber_mgmt/fiber.html#use_scheduling_algorithm"><code class="computeroutput">use_scheduling_algorithm()</code></a>:
56    </p>
57<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">thread_fn</span><span class="special">()</span> <span class="special">{</span>
58    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">use_scheduling_algorithm</span><span class="special">&lt;</span> <span class="identifier">my_fiber_scheduler</span> <span class="special">&gt;();</span>
59    <span class="special">...</span>
60<span class="special">}</span>
61</pre>
62<p>
63      A scheduler class must implement interface <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>. <span class="bold"><strong>Boost.Fiber</strong></span> provides schedulers: <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a>,
64      <a class="link" href="scheduling.html#class_work_stealing"><code class="computeroutput">work_stealing</code></a>, <a class="link" href="numa.html#class_numa_work_stealing"><code class="computeroutput">numa::work_stealing</code></a> and
65      <a class="link" href="scheduling.html#class_shared_work"><code class="computeroutput">shared_work</code></a>.
66    </p>
67<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">thread</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">uint32_t</span> <span class="identifier">thread_count</span><span class="special">)</span> <span class="special">{</span>
68    <span class="comment">// thread registers itself at work-stealing scheduler</span>
69    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">use_scheduling_algorithm</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">algo</span><span class="special">::</span><span class="identifier">work_stealing</span> <span class="special">&gt;(</span> <span class="identifier">thread_count</span><span class="special">);</span>
70    <span class="special">...</span>
71<span class="special">}</span>
72
73<span class="comment">// count of logical cpus</span>
74<span class="identifier">std</span><span class="special">::</span><span class="identifier">uint32_t</span> <span class="identifier">thread_count</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">hardware_concurrency</span><span class="special">();</span>
75<span class="comment">// start worker-threads first</span>
76<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">thread</span> <span class="special">&gt;</span> <span class="identifier">threads</span><span class="special">;</span>
77<span class="keyword">for</span> <span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">uint32_t</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span> <span class="comment">/* count start-thread */</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">thread_count</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
78    <span class="comment">// spawn thread</span>
79    <span class="identifier">threads</span><span class="special">.</span><span class="identifier">emplace_back</span><span class="special">(</span> <span class="identifier">thread</span><span class="special">,</span> <span class="identifier">thread_count</span><span class="special">);</span>
80<span class="special">}</span>
81<span class="comment">// start-thread registers itself at work-stealing scheduler</span>
82<span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">use_scheduling_algorithm</span><span class="special">&lt;</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">algo</span><span class="special">::</span><span class="identifier">work_stealing</span> <span class="special">&gt;(</span> <span class="identifier">thread_count</span><span class="special">);</span>
83<span class="special">...</span>
84</pre>
85<p>
86      The example spawns as many threads as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">thread</span><span class="special">::</span><span class="identifier">hardware_concurrency</span><span class="special">()</span></code> returns. Each thread runs a <a class="link" href="scheduling.html#class_work_stealing"><code class="computeroutput">work_stealing</code></a> scheduler.
87      Each instance of this scheduler needs to know how many threads run the work-stealing
88      scheduler in the program. If the local queue of one thread runs out of ready
89      fibers, the thread tries to steal a ready fiber from another thread running
90      this scheduler.
91    </p>
92<p>
93      </p>
94<h5>
95<a name="class_algorithm_bridgehead"></a>
96  <span class="phrase"><a name="class_algorithm"></a></span>
97  <a class="link" href="scheduling.html#class_algorithm">Class <code class="computeroutput">algorithm</code></a>
98</h5>
99<p>
100    </p>
101<p>
102      <code class="computeroutput"><span class="identifier">algorithm</span></code> is the abstract base
103      class defining the interface that a fiber scheduler must implement.
104    </p>
105<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">algo</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
106
107<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
108<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
109<span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
110
111<span class="keyword">struct</span> <span class="identifier">algorithm</span> <span class="special">{</span>
112    <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">algorithm</span><span class="special">();</span>
113
114    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
115
116    <span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
117
118    <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
119
120    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
121
122    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
123<span class="special">};</span>
124
125<span class="special">}}}</span>
126</pre>
127<p>
128      </p>
129<h5>
130<a name="algorithm_awakened_bridgehead"></a>
131  <span class="phrase"><a name="algorithm_awakened"></a></span>
132  <a class="link" href="scheduling.html#algorithm_awakened">Member function
133      <code class="computeroutput">awakened</code>()</a>
134</h5>
135<p>
136    </p>
137<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
138</pre>
139<div class="variablelist">
140<p class="title"><b></b></p>
141<dl class="variablelist">
142<dt><span class="term">Effects:</span></dt>
143<dd><p>
144            Informs the scheduler that fiber <code class="computeroutput"><span class="identifier">f</span></code>
145            is ready to run. Fiber <code class="computeroutput"><span class="identifier">f</span></code>
146            might be newly launched, or it might have been blocked but has just been
147            awakened, or it might have called <a class="link" href="fiber_mgmt/this_fiber.html#this_fiber_yield"><code class="computeroutput">this_fiber::yield()</code></a>.
148          </p></dd>
149<dt><span class="term">Note:</span></dt>
150<dd><p>
151            This method advises the scheduler to add fiber <code class="computeroutput"><span class="identifier">f</span></code>
152            to its collection of fibers ready to run. A typical scheduler implementation
153            places <code class="computeroutput"><span class="identifier">f</span></code> into a queue.
154          </p></dd>
155<dt><span class="term">See also:</span></dt>
156<dd><p>
157            <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a>
158          </p></dd>
159</dl>
160</div>
161<p>
162      </p>
163<h5>
164<a name="algorithm_pick_next_bridgehead"></a>
165  <span class="phrase"><a name="algorithm_pick_next"></a></span>
166  <a class="link" href="scheduling.html#algorithm_pick_next">Member
167      function <code class="computeroutput">pick_next</code>()</a>
168</h5>
169<p>
170    </p>
171<pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
172</pre>
173<div class="variablelist">
174<p class="title"><b></b></p>
175<dl class="variablelist">
176<dt><span class="term">Returns:</span></dt>
177<dd><p>
178            the fiber which is to be resumed next, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
179            if there is no ready fiber.
180          </p></dd>
181<dt><span class="term">Note:</span></dt>
182<dd><p>
183            This is where the scheduler actually specifies the fiber which is to
184            run next. A typical scheduler implementation chooses the head of the
185            ready queue.
186          </p></dd>
187<dt><span class="term">See also:</span></dt>
188<dd><p>
189            <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a>
190          </p></dd>
191</dl>
192</div>
193<p>
194      </p>
195<h5>
196<a name="algorithm_has_ready_fibers_bridgehead"></a>
197  <span class="phrase"><a name="algorithm_has_ready_fibers"></a></span>
198  <a class="link" href="scheduling.html#algorithm_has_ready_fibers">Member
199      function <code class="computeroutput">has_ready_fibers</code>()</a>
200</h5>
201<p>
202    </p>
203<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
204</pre>
205<div class="variablelist">
206<p class="title"><b></b></p>
207<dl class="variablelist">
208<dt><span class="term">Returns:</span></dt>
209<dd><p>
210            <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
211            ready to run.
212          </p></dd>
213</dl>
214</div>
215<p>
216      </p>
217<h5>
218<a name="algorithm_suspend_until_bridgehead"></a>
219  <span class="phrase"><a name="algorithm_suspend_until"></a></span>
220  <a class="link" href="scheduling.html#algorithm_suspend_until">Member
221      function <code class="computeroutput">suspend_until</code>()</a>
222</h5>
223<p>
224    </p>
225<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
226</pre>
227<div class="variablelist">
228<p class="title"><b></b></p>
229<dl class="variablelist">
230<dt><span class="term">Effects:</span></dt>
231<dd><p>
232            Informs the scheduler that no fiber will be ready until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
233          </p></dd>
234<dt><span class="term">Note:</span></dt>
235<dd><p>
236            This method allows a custom scheduler to yield control to the containing
237            environment in whatever way makes sense. The fiber manager is stating
238            that <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code>
239            need not return until <code class="computeroutput"><span class="identifier">abs_time</span></code>
240            — or <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a> is called — whichever comes first.
241            The interaction with <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> means that, for instance, calling
242            <a href="http://en.cppreference.com/w/cpp/thread/sleep_until" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">this_thread</span><span class="special">::</span><span class="identifier">sleep_until</span><span class="special">(</span><span class="identifier">abs_time</span><span class="special">)</span></code></a>
243            would be too simplistic. <a class="link" href="scheduling.html#round_robin_suspend_until"><code class="computeroutput">round_robin::suspend_until()</code></a> uses
244            a <a href="http://en.cppreference.com/w/cpp/thread/condition_variable" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span></code></a> to coordinate
245            with <a class="link" href="scheduling.html#round_robin_notify"><code class="computeroutput">round_robin::notify()</code></a>.
246          </p></dd>
247<dt><span class="term">Note:</span></dt>
248<dd><p>
249            Given that <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code>
250            might be called from another thread, your <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code> implementation — like the rest of your
251            <code class="computeroutput"><span class="identifier">algorithm</span></code> implementation
252            — must guard any data it shares with your <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> implementation.
253          </p></dd>
254</dl>
255</div>
256<p>
257      </p>
258<h5>
259<a name="algorithm_notify_bridgehead"></a>
260  <span class="phrase"><a name="algorithm_notify"></a></span>
261  <a class="link" href="scheduling.html#algorithm_notify">Member function
262      <code class="computeroutput">notify</code>()</a>
263</h5>
264<p>
265    </p>
266<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
267</pre>
268<div class="variablelist">
269<p class="title"><b></b></p>
270<dl class="variablelist">
271<dt><span class="term">Effects:</span></dt>
272<dd><p>
273            Requests the scheduler to return from a pending call to <a class="link" href="scheduling.html#algorithm_suspend_until"><code class="computeroutput">algorithm::suspend_until()</code></a>.
274          </p></dd>
275<dt><span class="term">Note:</span></dt>
276<dd><p>
277            Alone among the <code class="computeroutput"><span class="identifier">algorithm</span></code>
278            methods, <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code>
279            may be called from another thread. Your <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> implementation must guard any data
280            it shares with the rest of your <code class="computeroutput"><span class="identifier">algorithm</span></code>
281            implementation.
282          </p></dd>
283</dl>
284</div>
285<p>
286      </p>
287<h5>
288<a name="class_round_robin_bridgehead"></a>
289  <span class="phrase"><a name="class_round_robin"></a></span>
290  <a class="link" href="scheduling.html#class_round_robin">Class <code class="computeroutput">round_robin</code></a>
291</h5>
292<p>
293    </p>
294<p>
295      This class implements <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>, scheduling fibers in round-robin
296      fashion.
297    </p>
298<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">algo</span><span class="special">/</span><span class="identifier">round_robin</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
299
300<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
301<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
302<span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
303
304<span class="keyword">class</span> <span class="identifier">round_robin</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">algorithm</span> <span class="special">{</span>
305    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
306
307    <span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
308
309    <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
310
311    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
312
313    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
314<span class="special">};</span>
315
316<span class="special">}}}</span>
317</pre>
318<p>
319      </p>
320<h5>
321<a name="round_robin_awakened_bridgehead"></a>
322  <span class="phrase"><a name="round_robin_awakened"></a></span>
323  <a class="link" href="scheduling.html#round_robin_awakened">Member
324      function <code class="computeroutput">awakened</code>()</a>
325</h5>
326<p>
327    </p>
328<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
329</pre>
330<div class="variablelist">
331<p class="title"><b></b></p>
332<dl class="variablelist">
333<dt><span class="term">Effects:</span></dt>
334<dd><p>
335            Enqueues fiber <code class="computeroutput"><span class="identifier">f</span></code> onto
336            a ready queue.
337          </p></dd>
338<dt><span class="term">Throws:</span></dt>
339<dd><p>
340            Nothing.
341          </p></dd>
342</dl>
343</div>
344<p>
345      </p>
346<h5>
347<a name="round_robin_pick_next_bridgehead"></a>
348  <span class="phrase"><a name="round_robin_pick_next"></a></span>
349  <a class="link" href="scheduling.html#round_robin_pick_next">Member
350      function <code class="computeroutput">pick_next</code>()</a>
351</h5>
352<p>
353    </p>
354<pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
355</pre>
356<div class="variablelist">
357<p class="title"><b></b></p>
358<dl class="variablelist">
359<dt><span class="term">Returns:</span></dt>
360<dd><p>
361            the fiber at the head of the ready queue, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
362            if the queue is empty.
363          </p></dd>
364<dt><span class="term">Throws:</span></dt>
365<dd><p>
366            Nothing.
367          </p></dd>
368<dt><span class="term">Note:</span></dt>
369<dd><p>
370            Placing ready fibers onto the tail of a queue, and returning them from
371            the head of that queue, shares the thread between ready fibers in round-robin
372            fashion.
373          </p></dd>
374</dl>
375</div>
376<p>
377      </p>
378<h5>
379<a name="round_robin_has_ready_fibers_bridgehead"></a>
380  <span class="phrase"><a name="round_robin_has_ready_fibers"></a></span>
381  <a class="link" href="scheduling.html#round_robin_has_ready_fibers">Member
382      function <code class="computeroutput">has_ready_fibers</code>()</a>
383</h5>
384<p>
385    </p>
386<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
387</pre>
388<div class="variablelist">
389<p class="title"><b></b></p>
390<dl class="variablelist">
391<dt><span class="term">Returns:</span></dt>
392<dd><p>
393            <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
394            ready to run.
395          </p></dd>
396<dt><span class="term">Throws:</span></dt>
397<dd><p>
398            Nothing.
399          </p></dd>
400</dl>
401</div>
402<p>
403      </p>
404<h5>
405<a name="round_robin_suspend_until_bridgehead"></a>
406  <span class="phrase"><a name="round_robin_suspend_until"></a></span>
407  <a class="link" href="scheduling.html#round_robin_suspend_until">Member
408      function <code class="computeroutput">suspend_until</code>()</a>
409</h5>
410<p>
411    </p>
412<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
413</pre>
414<div class="variablelist">
415<p class="title"><b></b></p>
416<dl class="variablelist">
417<dt><span class="term">Effects:</span></dt>
418<dd><p>
419            Informs <code class="computeroutput"><span class="identifier">round_robin</span></code> that
420            no ready fiber will be available until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
421            This implementation blocks in <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/wait_until" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">wait_until</span><span class="special">()</span></code></a>.
422          </p></dd>
423<dt><span class="term">Throws:</span></dt>
424<dd><p>
425            Nothing.
426          </p></dd>
427</dl>
428</div>
429<p>
430      </p>
431<h5>
432<a name="round_robin_notify_bridgehead"></a>
433  <span class="phrase"><a name="round_robin_notify"></a></span>
434  <a class="link" href="scheduling.html#round_robin_notify">Member function
435      <code class="computeroutput">notify</code>()</a>
436</h5>
437<p>
438    </p>
439<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
440</pre>
441<div class="variablelist">
442<p class="title"><b></b></p>
443<dl class="variablelist">
444<dt><span class="term">Effects:</span></dt>
445<dd><p>
446            Wake up a pending call to <a class="link" href="scheduling.html#round_robin_suspend_until"><code class="computeroutput">round_robin::suspend_until()</code></a>,
447            some fibers might be ready. This implementation wakes <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code> via <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">notify_all</span><span class="special">()</span></code></a>.
448          </p></dd>
449<dt><span class="term">Throws:</span></dt>
450<dd><p>
451            Nothing.
452          </p></dd>
453</dl>
454</div>
455<p>
456      </p>
457<h5>
458<a name="class_work_stealing_bridgehead"></a>
459  <span class="phrase"><a name="class_work_stealing"></a></span>
460  <a class="link" href="scheduling.html#class_work_stealing">Class <code class="computeroutput">work_stealing</code></a>
461</h5>
462<p>
463    </p>
464<p>
465      This class implements <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>; if the local ready-queue runs
466      out of ready fibers, ready fibers are stolen from other schedulers.<br> The
467      victim scheduler (from which a ready fiber is stolen) is selected at random.
468    </p>
469<div class="note"><table border="0" summary="Note">
470<tr>
471<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
472<th align="left">Note</th>
473</tr>
474<tr><td align="left" valign="top"><p>
475        Worker-threads are stored in a static variable, dynamically adding/removing
476        worker threads is not supported.
477      </p></td></tr>
478</table></div>
479<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">algo</span><span class="special">/</span><span class="identifier">work_stealing</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
480
481<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
482<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
483<span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
484
485<span class="keyword">class</span> <span class="identifier">work_stealing</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">algorithm</span> <span class="special">{</span>
486<span class="keyword">public</span><span class="special">:</span>
487    <span class="identifier">work_stealing</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">uint32_t</span> <span class="identifier">thread_count</span><span class="special">,</span> <span class="keyword">bool</span> <span class="identifier">suspend</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">);</span>
488
489    <span class="identifier">work_stealing</span><span class="special">(</span> <span class="identifier">work_stealing</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
490    <span class="identifier">work_stealing</span><span class="special">(</span> <span class="identifier">work_stealing</span> <span class="special">&amp;&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
491
492    <span class="identifier">work_stealing</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">work_stealing</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
493    <span class="identifier">work_stealing</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">work_stealing</span> <span class="special">&amp;&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
494
495    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
496
497    <span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
498
499    <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
500
501    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
502
503    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
504<span class="special">};</span>
505
506<span class="special">}}}</span>
507</pre>
508<h4>
509<a name="fiber.scheduling.h0"></a>
510      <span class="phrase"><a name="fiber.scheduling.constructor"></a></span><a class="link" href="scheduling.html#fiber.scheduling.constructor">Constructor</a>
511    </h4>
512<pre class="programlisting"><span class="identifier">work_stealing</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">uint32_t</span> <span class="identifier">thread_count</span><span class="special">,</span> <span class="keyword">bool</span> <span class="identifier">suspend</span> <span class="special">=</span> <span class="keyword">false</span><span class="special">);</span>
513</pre>
514<div class="variablelist">
515<p class="title"><b></b></p>
516<dl class="variablelist">
517<dt><span class="term">Effects:</span></dt>
518<dd><p>
519            Constructs work-stealing scheduling algorithm. <code class="computeroutput"><span class="identifier">thread_count</span></code>
520            represents the number of threads running this algorithm.
521          </p></dd>
522<dt><span class="term">Throws:</span></dt>
523<dd><p>
524            <code class="computeroutput"><span class="identifier">system_error</span></code>
525          </p></dd>
526<dt><span class="term">Note:</span></dt>
527<dd><p>
528            If <code class="computeroutput"><span class="identifier">suspend</span></code> is set to
529            <code class="computeroutput"><span class="keyword">true</span></code>, then the scheduler
530            suspends if no ready fiber could be stolen. The scheduler will by woken
531            up if a sleeping fiber times out or it was notified from remote (other
532            thread or fiber scheduler).
533          </p></dd>
534</dl>
535</div>
536<p>
537      </p>
538<h5>
539<a name="work_stealing_awakened_bridgehead"></a>
540  <span class="phrase"><a name="work_stealing_awakened"></a></span>
541  <a class="link" href="scheduling.html#work_stealing_awakened">Member
542      function <code class="computeroutput">awakened</code>()</a>
543</h5>
544<p>
545    </p>
546<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
547</pre>
548<div class="variablelist">
549<p class="title"><b></b></p>
550<dl class="variablelist">
551<dt><span class="term">Effects:</span></dt>
552<dd><p>
553            Enqueues fiber <code class="computeroutput"><span class="identifier">f</span></code> onto
554            the shared ready queue.
555          </p></dd>
556<dt><span class="term">Throws:</span></dt>
557<dd><p>
558            Nothing.
559          </p></dd>
560</dl>
561</div>
562<p>
563      </p>
564<h5>
565<a name="work_stealing_pick_next_bridgehead"></a>
566  <span class="phrase"><a name="work_stealing_pick_next"></a></span>
567  <a class="link" href="scheduling.html#work_stealing_pick_next">Member
568      function <code class="computeroutput">pick_next</code>()</a>
569</h5>
570<p>
571    </p>
572<pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
573</pre>
574<div class="variablelist">
575<p class="title"><b></b></p>
576<dl class="variablelist">
577<dt><span class="term">Returns:</span></dt>
578<dd><p>
579            the fiber at the head of the ready queue, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
580            if the queue is empty.
581          </p></dd>
582<dt><span class="term">Throws:</span></dt>
583<dd><p>
584            Nothing.
585          </p></dd>
586<dt><span class="term">Note:</span></dt>
587<dd><p>
588            Placing ready fibers onto the tail of the sahred queue, and returning
589            them from the head of that queue, shares the thread between ready fibers
590            in round-robin fashion.
591          </p></dd>
592</dl>
593</div>
594<p>
595      </p>
596<h5>
597<a name="work_stealing_has_ready_fibers_bridgehead"></a>
598  <span class="phrase"><a name="work_stealing_has_ready_fibers"></a></span>
599  <a class="link" href="scheduling.html#work_stealing_has_ready_fibers">Member
600      function <code class="computeroutput">has_ready_fibers</code>()</a>
601</h5>
602<p>
603    </p>
604<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
605</pre>
606<div class="variablelist">
607<p class="title"><b></b></p>
608<dl class="variablelist">
609<dt><span class="term">Returns:</span></dt>
610<dd><p>
611            <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
612            ready to run.
613          </p></dd>
614<dt><span class="term">Throws:</span></dt>
615<dd><p>
616            Nothing.
617          </p></dd>
618</dl>
619</div>
620<p>
621      </p>
622<h5>
623<a name="work_stealing_suspend_until_bridgehead"></a>
624  <span class="phrase"><a name="work_stealing_suspend_until"></a></span>
625  <a class="link" href="scheduling.html#work_stealing_suspend_until">Member
626      function <code class="computeroutput">suspend_until</code>()</a>
627</h5>
628<p>
629    </p>
630<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
631</pre>
632<div class="variablelist">
633<p class="title"><b></b></p>
634<dl class="variablelist">
635<dt><span class="term">Effects:</span></dt>
636<dd><p>
637            Informs <code class="computeroutput"><span class="identifier">work_stealing</span></code>
638            that no ready fiber will be available until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>. This implementation blocks
639            in <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/wait_until" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">wait_until</span><span class="special">()</span></code></a>.
640          </p></dd>
641<dt><span class="term">Throws:</span></dt>
642<dd><p>
643            Nothing.
644          </p></dd>
645</dl>
646</div>
647<p>
648      </p>
649<h5>
650<a name="work_stealing_notify_bridgehead"></a>
651  <span class="phrase"><a name="work_stealing_notify"></a></span>
652  <a class="link" href="scheduling.html#work_stealing_notify">Member
653      function <code class="computeroutput">notify</code>()</a>
654</h5>
655<p>
656    </p>
657<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
658</pre>
659<div class="variablelist">
660<p class="title"><b></b></p>
661<dl class="variablelist">
662<dt><span class="term">Effects:</span></dt>
663<dd><p>
664            Wake up a pending call to <a class="link" href="scheduling.html#work_stealing_suspend_until"><code class="computeroutput">work_stealing::suspend_until()</code></a>,
665            some fibers might be ready. This implementation wakes <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code> via <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">notify_all</span><span class="special">()</span></code></a>.
666          </p></dd>
667<dt><span class="term">Throws:</span></dt>
668<dd><p>
669            Nothing.
670          </p></dd>
671</dl>
672</div>
673<p>
674      </p>
675<h5>
676<a name="class_shared_work_bridgehead"></a>
677  <span class="phrase"><a name="class_shared_work"></a></span>
678  <a class="link" href="scheduling.html#class_shared_work">Class <code class="computeroutput">shared_work</code></a>
679</h5>
680<p>
681    </p>
682<div class="note"><table border="0" summary="Note">
683<tr>
684<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
685<th align="left">Note</th>
686</tr>
687<tr><td align="left" valign="top"><p>
688        Because of the non-locality of data, <span class="emphasis"><em>shared_work</em></span> is
689        less performant than <a class="link" href="scheduling.html#class_work_stealing"><code class="computeroutput">work_stealing</code></a>.
690      </p></td></tr>
691</table></div>
692<p>
693      This class implements <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>, scheduling fibers in round-robin
694      fashion. Ready fibers are shared between all instances (running on different
695      threads) of shared_work, thus the work is distributed equally over all threads.
696    </p>
697<div class="note"><table border="0" summary="Note">
698<tr>
699<td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
700<th align="left">Note</th>
701</tr>
702<tr><td align="left" valign="top"><p>
703        Worker-threads are stored in a static variable, dynamically adding/removing
704        worker threads is not supported.
705      </p></td></tr>
706</table></div>
707<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">algo</span><span class="special">/</span><span class="identifier">shared_work</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
708
709<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
710<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
711<span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
712
713<span class="keyword">class</span> <span class="identifier">shared_work</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">algorithm</span> <span class="special">{</span>
714    <span class="identifier">shared_work</span><span class="special">();</span>
715    <span class="identifier">shared_work</span><span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">suspend</span><span class="special">);</span>
716
717    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
718
719    <span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
720
721    <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
722
723    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
724
725    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
726<span class="special">};</span>
727
728<span class="special">}}}</span>
729</pre>
730<h4>
731<a name="fiber.scheduling.h1"></a>
732      <span class="phrase"><a name="fiber.scheduling.constructor0"></a></span><a class="link" href="scheduling.html#fiber.scheduling.constructor0">Constructor</a>
733    </h4>
734<pre class="programlisting"><span class="identifier">shared_work</span><span class="special">();</span>
735<span class="identifier">shared_work</span><span class="special">(</span> <span class="keyword">bool</span> <span class="identifier">suspend</span><span class="special">);</span>
736</pre>
737<div class="variablelist">
738<p class="title"><b></b></p>
739<dl class="variablelist">
740<dt><span class="term">Effects:</span></dt>
741<dd><p>
742            Constructs work-sharing scheduling algorithm.
743          </p></dd>
744<dt><span class="term">Throws:</span></dt>
745<dd><p>
746            <code class="computeroutput"><span class="identifier">system_error</span></code>
747          </p></dd>
748<dt><span class="term">Note:</span></dt>
749<dd><p>
750            If <code class="computeroutput"><span class="identifier">suspend</span></code> is set to
751            <code class="computeroutput"><span class="keyword">true</span></code> (default is <code class="computeroutput"><span class="keyword">false</span></code>), then the scheduler suspends if
752            no ready fiber could be stolen. The scheduler will by woken up if a sleeping
753            fiber times out or it was notified from remote (other thread or fiber
754            scheduler).
755          </p></dd>
756</dl>
757</div>
758<p>
759      </p>
760<h5>
761<a name="shared_work_awakened_bridgehead"></a>
762  <span class="phrase"><a name="shared_work_awakened"></a></span>
763  <a class="link" href="scheduling.html#shared_work_awakened">Member
764      function <code class="computeroutput">awakened</code>()</a>
765</h5>
766<p>
767    </p>
768<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
769</pre>
770<div class="variablelist">
771<p class="title"><b></b></p>
772<dl class="variablelist">
773<dt><span class="term">Effects:</span></dt>
774<dd><p>
775            Enqueues fiber <code class="computeroutput"><span class="identifier">f</span></code> onto
776            the shared ready queue.
777          </p></dd>
778<dt><span class="term">Throws:</span></dt>
779<dd><p>
780            Nothing.
781          </p></dd>
782</dl>
783</div>
784<p>
785      </p>
786<h5>
787<a name="shared_work_pick_next_bridgehead"></a>
788  <span class="phrase"><a name="shared_work_pick_next"></a></span>
789  <a class="link" href="scheduling.html#shared_work_pick_next">Member
790      function <code class="computeroutput">pick_next</code>()</a>
791</h5>
792<p>
793    </p>
794<pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
795</pre>
796<div class="variablelist">
797<p class="title"><b></b></p>
798<dl class="variablelist">
799<dt><span class="term">Returns:</span></dt>
800<dd><p>
801            the fiber at the head of the ready queue, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
802            if the queue is empty.
803          </p></dd>
804<dt><span class="term">Throws:</span></dt>
805<dd><p>
806            Nothing.
807          </p></dd>
808<dt><span class="term">Note:</span></dt>
809<dd><p>
810            Placing ready fibers onto the tail of the shared queue, and returning
811            them from the head of that queue, shares the thread between ready fibers
812            in round-robin fashion.
813          </p></dd>
814</dl>
815</div>
816<p>
817      </p>
818<h5>
819<a name="shared_work_has_ready_fibers_bridgehead"></a>
820  <span class="phrase"><a name="shared_work_has_ready_fibers"></a></span>
821  <a class="link" href="scheduling.html#shared_work_has_ready_fibers">Member
822      function <code class="computeroutput">has_ready_fibers</code>()</a>
823</h5>
824<p>
825    </p>
826<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
827</pre>
828<div class="variablelist">
829<p class="title"><b></b></p>
830<dl class="variablelist">
831<dt><span class="term">Returns:</span></dt>
832<dd><p>
833            <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
834            ready to run.
835          </p></dd>
836<dt><span class="term">Throws:</span></dt>
837<dd><p>
838            Nothing.
839          </p></dd>
840</dl>
841</div>
842<p>
843      </p>
844<h5>
845<a name="shared_work_suspend_until_bridgehead"></a>
846  <span class="phrase"><a name="shared_work_suspend_until"></a></span>
847  <a class="link" href="scheduling.html#shared_work_suspend_until">Member
848      function <code class="computeroutput">suspend_until</code>()</a>
849</h5>
850<p>
851    </p>
852<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
853</pre>
854<div class="variablelist">
855<p class="title"><b></b></p>
856<dl class="variablelist">
857<dt><span class="term">Effects:</span></dt>
858<dd><p>
859            Informs <code class="computeroutput"><span class="identifier">shared_work</span></code> that
860            no ready fiber will be available until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
861            This implementation blocks in <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/wait_until" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">wait_until</span><span class="special">()</span></code></a>.
862          </p></dd>
863<dt><span class="term">Throws:</span></dt>
864<dd><p>
865            Nothing.
866          </p></dd>
867</dl>
868</div>
869<p>
870      </p>
871<h5>
872<a name="shared_work_notify_bridgehead"></a>
873  <span class="phrase"><a name="shared_work_notify"></a></span>
874  <a class="link" href="scheduling.html#shared_work_notify">Member function
875      <code class="computeroutput">notify</code>()</a>
876</h5>
877<p>
878    </p>
879<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
880</pre>
881<div class="variablelist">
882<p class="title"><b></b></p>
883<dl class="variablelist">
884<dt><span class="term">Effects:</span></dt>
885<dd><p>
886            Wake up a pending call to <a class="link" href="scheduling.html#shared_work_suspend_until"><code class="computeroutput">shared_work::suspend_until()</code></a>,
887            some fibers might be ready. This implementation wakes <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code> via <a href="http://en.cppreference.com/w/cpp/thread/condition_variable/notify_all" target="_top"><code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">condition_variable</span><span class="special">::</span><span class="identifier">notify_all</span><span class="special">()</span></code></a>.
888          </p></dd>
889<dt><span class="term">Throws:</span></dt>
890<dd><p>
891            Nothing.
892          </p></dd>
893</dl>
894</div>
895<h4>
896<a name="fiber.scheduling.h2"></a>
897      <span class="phrase"><a name="fiber.scheduling.custom_scheduler_fiber_properties"></a></span><a class="link" href="scheduling.html#fiber.scheduling.custom_scheduler_fiber_properties">Custom
898      Scheduler Fiber Properties</a>
899    </h4>
900<p>
901      A scheduler class directly derived from <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> can use any
902      information available from <a class="link" href="scheduling.html#class_context"><code class="computeroutput">context</code></a> to implement the <code class="computeroutput"><span class="identifier">algorithm</span></code> interface. But a custom scheduler
903      might need to track additional properties for a fiber. For instance, a priority-based
904      scheduler would need to track a fiber’s priority.
905    </p>
906<p>
907      <span class="bold"><strong>Boost.Fiber</strong></span> provides a mechanism by which
908      your custom scheduler can associate custom properties with each fiber.
909    </p>
910<p>
911      </p>
912<h5>
913<a name="class_fiber_properties_bridgehead"></a>
914  <span class="phrase"><a name="class_fiber_properties"></a></span>
915  <a class="link" href="scheduling.html#class_fiber_properties">Class
916      <code class="computeroutput">fiber_properties</code></a>
917</h5>
918<p>
919    </p>
920<p>
921      A custom fiber properties class must be derived from <code class="computeroutput"><span class="identifier">fiber_properties</span></code>.
922    </p>
923<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">properties</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
924
925<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
926<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
927
928<span class="keyword">class</span> <span class="identifier">fiber_properties</span> <span class="special">{</span>
929<span class="keyword">public</span><span class="special">:</span>
930    <span class="identifier">fiber_properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
931
932    <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">fiber_properties</span><span class="special">();</span>
933
934<span class="keyword">protected</span><span class="special">:</span>
935    <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
936<span class="special">};</span>
937
938<span class="special">}}</span>
939</pre>
940<h4>
941<a name="fiber.scheduling.h3"></a>
942      <span class="phrase"><a name="fiber.scheduling.constructor1"></a></span><a class="link" href="scheduling.html#fiber.scheduling.constructor1">Constructor</a>
943    </h4>
944<pre class="programlisting"><span class="identifier">fiber_properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
945</pre>
946<div class="variablelist">
947<p class="title"><b></b></p>
948<dl class="variablelist">
949<dt><span class="term">Effects:</span></dt>
950<dd><p>
951            Constructs base-class component of custom subclass.
952          </p></dd>
953<dt><span class="term">Throws:</span></dt>
954<dd><p>
955            Nothing.
956          </p></dd>
957<dt><span class="term">Note:</span></dt>
958<dd><p>
959            Your subclass constructor must accept a <code class="computeroutput"><span class="identifier">context</span><span class="special">*</span></code> and pass it to the base-class <code class="computeroutput"><span class="identifier">fiber_properties</span></code> constructor.
960          </p></dd>
961</dl>
962</div>
963<p>
964      </p>
965<h5>
966<a name="fiber_properties_notify_bridgehead"></a>
967  <span class="phrase"><a name="fiber_properties_notify"></a></span>
968  <a class="link" href="scheduling.html#fiber_properties_notify">Member
969      function <code class="computeroutput">notify</code>()</a>
970</h5>
971<p>
972    </p>
973<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
974</pre>
975<div class="variablelist">
976<p class="title"><b></b></p>
977<dl class="variablelist">
978<dt><span class="term">Effects:</span></dt>
979<dd><p>
980            Pass control to the custom <a class="link" href="scheduling.html#class_algorithm_with_properties"><code class="computeroutput">algorithm_with_properties&lt;&gt;</code></a> subclass’s
981            <a class="link" href="scheduling.html#algorithm_with_properties_property_change"><code class="computeroutput">algorithm_with_properties::property_change()</code></a> method.
982          </p></dd>
983<dt><span class="term">Throws:</span></dt>
984<dd><p>
985            Nothing.
986          </p></dd>
987<dt><span class="term">Note:</span></dt>
988<dd><p>
989            A custom scheduler’s <a class="link" href="scheduling.html#algorithm_with_properties_pick_next"><code class="computeroutput">algorithm_with_properties::pick_next()</code></a> method
990            might dynamically select from the ready fibers, or <a class="link" href="scheduling.html#algorithm_with_properties_awakened"><code class="computeroutput">algorithm_with_properties::awakened()</code></a> might
991            instead insert each ready fiber into some form of ready queue for <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code>.
992            In the latter case, if application code modifies a fiber property (e.g.
993            priority) that should affect that fiber’s relationship to other ready
994            fibers, the custom scheduler must be given the opportunity to reorder
995            its ready queue. The custom property subclass should implement an access
996            method to modify such a property; that access method should call <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code>
997            once the new property value has been stored. This passes control to the
998            custom scheduler’s <code class="computeroutput"><span class="identifier">property_change</span><span class="special">()</span></code> method, allowing the custom scheduler
999            to reorder its ready queue appropriately. Use at your discretion. Of
1000            course, if you define a property which does not affect the behavior of
1001            the <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code>
1002            method, you need not call <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> when that property is modified.
1003          </p></dd>
1004</dl>
1005</div>
1006<p>
1007      </p>
1008<h5>
1009<a name="class_algorithm_with_properties_bridgehead"></a>
1010  <span class="phrase"><a name="class_algorithm_with_properties"></a></span>
1011  <a class="link" href="scheduling.html#class_algorithm_with_properties">Template
1012      <code class="computeroutput">algorithm_with_properties&lt;&gt;</code></a>
1013</h5>
1014<p>
1015    </p>
1016<p>
1017      A custom scheduler that depends on a custom properties class <code class="computeroutput"><span class="identifier">PROPS</span></code> should be derived from <code class="computeroutput"><span class="identifier">algorithm_with_properties</span><span class="special">&lt;</span><span class="identifier">PROPS</span><span class="special">&gt;</span></code>.
1018      <code class="computeroutput"><span class="identifier">PROPS</span></code> should be derived from
1019      <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a>.
1020    </p>
1021<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">algorithm</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
1022
1023<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
1024<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
1025<span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
1026
1027<span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">PROPS</span> <span class="special">&gt;</span>
1028<span class="keyword">struct</span> <span class="identifier">algorithm_with_properties</span> <span class="special">{</span>
1029    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*,</span> <span class="identifier">PROPS</span> <span class="special">&amp;)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
1030
1031    <span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1032
1033    <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1034
1035    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
1036
1037    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
1038
1039    <span class="identifier">PROPS</span> <span class="special">&amp;</span> <span class="identifier">properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1040
1041    <span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">property_change</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*,</span> <span class="identifier">PROPS</span> <span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1042
1043    <span class="keyword">virtual</span> <span class="identifier">fiber_properties</span> <span class="special">*</span> <span class="identifier">new_properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*);</span>
1044<span class="special">};</span>
1045
1046<span class="special">}}}</span>
1047</pre>
1048<p>
1049      </p>
1050<h5>
1051<a name="algorithm_with_properties_awakened_bridgehead"></a>
1052  <span class="phrase"><a name="algorithm_with_properties_awakened"></a></span>
1053  <a class="link" href="scheduling.html#algorithm_with_properties_awakened">Member
1054      function <code class="computeroutput">awakened</code>()</a>
1055</h5>
1056<p>
1057    </p>
1058<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">awakened</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">PROPS</span> <span class="special">&amp;</span> <span class="identifier">properties</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1059</pre>
1060<div class="variablelist">
1061<p class="title"><b></b></p>
1062<dl class="variablelist">
1063<dt><span class="term">Effects:</span></dt>
1064<dd><p>
1065            Informs the scheduler that fiber <code class="computeroutput"><span class="identifier">f</span></code>
1066            is ready to run, like <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a>. Passes
1067            the fiber’s associated <code class="computeroutput"><span class="identifier">PROPS</span></code>
1068            instance.
1069          </p></dd>
1070<dt><span class="term">Throws:</span></dt>
1071<dd><p>
1072            Nothing.
1073          </p></dd>
1074<dt><span class="term">Note:</span></dt>
1075<dd><p>
1076            An <code class="computeroutput"><span class="identifier">algorithm_with_properties</span><span class="special">&lt;&gt;</span></code> subclass must override this method
1077            instead of <code class="computeroutput"><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">awakened</span><span class="special">()</span></code>.
1078          </p></dd>
1079</dl>
1080</div>
1081<p>
1082      </p>
1083<h5>
1084<a name="algorithm_with_properties_pick_next_bridgehead"></a>
1085  <span class="phrase"><a name="algorithm_with_properties_pick_next"></a></span>
1086  <a class="link" href="scheduling.html#algorithm_with_properties_pick_next">Member
1087      function <code class="computeroutput">pick_next</code>()</a>
1088</h5>
1089<p>
1090    </p>
1091<pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">pick_next</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1092</pre>
1093<div class="variablelist">
1094<p class="title"><b></b></p>
1095<dl class="variablelist">
1096<dt><span class="term">Returns:</span></dt>
1097<dd><p>
1098            the fiber which is to be resumed next, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
1099            if there is no ready fiber.
1100          </p></dd>
1101<dt><span class="term">Throws:</span></dt>
1102<dd><p>
1103            Nothing.
1104          </p></dd>
1105<dt><span class="term">Note:</span></dt>
1106<dd><p>
1107            same as <a class="link" href="scheduling.html#algorithm_pick_next"><code class="computeroutput">algorithm::pick_next()</code></a>
1108          </p></dd>
1109</dl>
1110</div>
1111<p>
1112      </p>
1113<h5>
1114<a name="algorithm_with_properties_has_ready_fibers_bridgehead"></a>
1115  <span class="phrase"><a name="algorithm_with_properties_has_ready_fibers"></a></span>
1116  <a class="link" href="scheduling.html#algorithm_with_properties_has_ready_fibers">Member
1117      function <code class="computeroutput">has_ready_fibers</code>()</a>
1118</h5>
1119<p>
1120    </p>
1121<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">has_ready_fibers</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1122</pre>
1123<div class="variablelist">
1124<p class="title"><b></b></p>
1125<dl class="variablelist">
1126<dt><span class="term">Returns:</span></dt>
1127<dd><p>
1128            <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
1129            ready to run.
1130          </p></dd>
1131<dt><span class="term">Throws:</span></dt>
1132<dd><p>
1133            Nothing.
1134          </p></dd>
1135<dt><span class="term">Note:</span></dt>
1136<dd><p>
1137            same as <a class="link" href="scheduling.html#algorithm_has_ready_fibers"><code class="computeroutput">algorithm::has_ready_fibers()</code></a>
1138          </p></dd>
1139</dl>
1140</div>
1141<p>
1142      </p>
1143<h5>
1144<a name="algorithm_with_properties_suspend_until_bridgehead"></a>
1145  <span class="phrase"><a name="algorithm_with_properties_suspend_until"></a></span>
1146  <a class="link" href="scheduling.html#algorithm_with_properties_suspend_until">Member
1147      function <code class="computeroutput">suspend_until</code>()</a>
1148</h5>
1149<p>
1150    </p>
1151<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">suspend_until</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">chrono</span><span class="special">::</span><span class="identifier">steady_clock</span><span class="special">::</span><span class="identifier">time_point</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
1152</pre>
1153<div class="variablelist">
1154<p class="title"><b></b></p>
1155<dl class="variablelist">
1156<dt><span class="term">Effects:</span></dt>
1157<dd><p>
1158            Informs the scheduler that no fiber will be ready until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
1159          </p></dd>
1160<dt><span class="term">Note:</span></dt>
1161<dd><p>
1162            same as <a class="link" href="scheduling.html#algorithm_suspend_until"><code class="computeroutput">algorithm::suspend_until()</code></a>
1163          </p></dd>
1164</dl>
1165</div>
1166<p>
1167      </p>
1168<h5>
1169<a name="algorithm_with_properties_notify_bridgehead"></a>
1170  <span class="phrase"><a name="algorithm_with_properties_notify"></a></span>
1171  <a class="link" href="scheduling.html#algorithm_with_properties_notify">Member
1172      function <code class="computeroutput">notify</code>()</a>
1173</h5>
1174<p>
1175    </p>
1176<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
1177</pre>
1178<div class="variablelist">
1179<p class="title"><b></b></p>
1180<dl class="variablelist">
1181<dt><span class="term">Effects:</span></dt>
1182<dd><p>
1183            Requests the scheduler to return from a pending call to <a class="link" href="scheduling.html#algorithm_with_properties_suspend_until"><code class="computeroutput">algorithm_with_properties::suspend_until()</code></a>.
1184          </p></dd>
1185<dt><span class="term">Note:</span></dt>
1186<dd><p>
1187            same as <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a>
1188          </p></dd>
1189</dl>
1190</div>
1191<p>
1192      </p>
1193<h5>
1194<a name="algorithm_with_properties_properties_bridgehead"></a>
1195  <span class="phrase"><a name="algorithm_with_properties_properties"></a></span>
1196  <a class="link" href="scheduling.html#algorithm_with_properties_properties">Member
1197      function <code class="computeroutput">properties</code>()</a>
1198</h5>
1199<p>
1200    </p>
1201<pre class="programlisting"><span class="identifier">PROPS</span><span class="special">&amp;</span> <span class="identifier">properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1202</pre>
1203<div class="variablelist">
1204<p class="title"><b></b></p>
1205<dl class="variablelist">
1206<dt><span class="term">Returns:</span></dt>
1207<dd><p>
1208            the <code class="computeroutput"><span class="identifier">PROPS</span></code> instance associated
1209            with fiber <code class="computeroutput"><span class="identifier">f</span></code>.
1210          </p></dd>
1211<dt><span class="term">Throws:</span></dt>
1212<dd><p>
1213            Nothing.
1214          </p></dd>
1215<dt><span class="term">Note:</span></dt>
1216<dd><p>
1217            The fiber’s associated <code class="computeroutput"><span class="identifier">PROPS</span></code>
1218            instance is already passed to <a class="link" href="scheduling.html#algorithm_with_properties_awakened"><code class="computeroutput">algorithm_with_properties::awakened()</code></a> and
1219            <a class="link" href="scheduling.html#algorithm_with_properties_property_change"><code class="computeroutput">algorithm_with_properties::property_change()</code></a>.
1220            However, every <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> subclass is expected to track
1221            a collection of ready <a class="link" href="scheduling.html#class_context"><code class="computeroutput">context</code></a> instances. This method allows
1222            your custom scheduler to retrieve the <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a> subclass
1223            instance for any <code class="computeroutput"><span class="identifier">context</span></code>
1224            in its collection.
1225          </p></dd>
1226</dl>
1227</div>
1228<p>
1229      </p>
1230<h5>
1231<a name="algorithm_with_properties_property_change_bridgehead"></a>
1232  <span class="phrase"><a name="algorithm_with_properties_property_change"></a></span>
1233  <a class="link" href="scheduling.html#algorithm_with_properties_property_change">Member
1234      function <code class="computeroutput">property_change</code>()</a>
1235</h5>
1236<p>
1237    </p>
1238<pre class="programlisting"><span class="keyword">virtual</span> <span class="keyword">void</span> <span class="identifier">property_change</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">,</span> <span class="identifier">PROPS</span> <span class="special">&amp;</span> <span class="identifier">properties</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1239</pre>
1240<div class="variablelist">
1241<p class="title"><b></b></p>
1242<dl class="variablelist">
1243<dt><span class="term">Effects:</span></dt>
1244<dd><p>
1245            Notify the custom scheduler of a possibly-relevant change to a property
1246            belonging to fiber <code class="computeroutput"><span class="identifier">f</span></code>.
1247            <code class="computeroutput"><span class="identifier">properties</span></code> contains the
1248            new values of all relevant properties.
1249          </p></dd>
1250<dt><span class="term">Throws:</span></dt>
1251<dd><p>
1252            Nothing.
1253          </p></dd>
1254<dt><span class="term">Note:</span></dt>
1255<dd><p>
1256            This method is only called when a custom <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a> subclass
1257            explicitly calls <a class="link" href="scheduling.html#fiber_properties_notify"><code class="computeroutput">fiber_properties::notify()</code></a>.
1258          </p></dd>
1259</dl>
1260</div>
1261<p>
1262      </p>
1263<h5>
1264<a name="algorithm_with_properties_new_properties_bridgehead"></a>
1265  <span class="phrase"><a name="algorithm_with_properties_new_properties"></a></span>
1266  <a class="link" href="scheduling.html#algorithm_with_properties_new_properties">Member
1267      function <code class="computeroutput">new_properties</code>()</a>
1268</h5>
1269<p>
1270    </p>
1271<pre class="programlisting"><span class="keyword">virtual</span> <span class="identifier">fiber_properties</span> <span class="special">*</span> <span class="identifier">new_properties</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">);</span>
1272</pre>
1273<div class="variablelist">
1274<p class="title"><b></b></p>
1275<dl class="variablelist">
1276<dt><span class="term">Returns:</span></dt>
1277<dd><p>
1278            A new instance of <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a> subclass <code class="computeroutput"><span class="identifier">PROPS</span></code>.
1279          </p></dd>
1280<dt><span class="term">Note:</span></dt>
1281<dd><p>
1282            By default, <code class="computeroutput"><span class="identifier">algorithm_with_properties</span><span class="special">&lt;&gt;::</span><span class="identifier">new_properties</span><span class="special">()</span></code> simply returns <code class="computeroutput"><span class="keyword">new</span>
1283            <span class="identifier">PROPS</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></code>,
1284            placing the <code class="computeroutput"><span class="identifier">PROPS</span></code> instance
1285            on the heap. Override this method to allocate <code class="computeroutput"><span class="identifier">PROPS</span></code>
1286            some other way. The returned <code class="computeroutput"><span class="identifier">fiber_properties</span></code>
1287            pointer must point to the <code class="computeroutput"><span class="identifier">PROPS</span></code>
1288            instance to be associated with fiber <code class="computeroutput"><span class="identifier">f</span></code>.
1289          </p></dd>
1290</dl>
1291</div>
1292<p>
1293      <a name="context"></a></p>
1294<h5>
1295<a name="class_context_bridgehead"></a>
1296  <span class="phrase"><a name="class_context"></a></span>
1297  <a class="link" href="scheduling.html#class_context">Class
1298      <code class="computeroutput">context</code></a>
1299</h5>
1300<p>
1301    </p>
1302<p>
1303      While you are free to treat <code class="computeroutput"><span class="identifier">context</span><span class="special">*</span></code> as an opaque token, certain <code class="computeroutput"><span class="identifier">context</span></code> members may be useful to a custom
1304      scheduler implementation.
1305    </p>
1306<p>
1307      <a name="ready_queue_t"></a>Of particular note is the fact that <code class="computeroutput"><span class="identifier">context</span></code> contains a hook to participate in
1308      a <a href="http://www.boost.org/doc/libs/release/doc/html/intrusive/list.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">intrusive</span><span class="special">::</span><span class="identifier">list</span></code></a>
1309      <code class="literal">typedef</code>’ed as <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">scheduler</span><span class="special">::</span><span class="identifier">ready_queue_t</span></code>.
1310      This hook is reserved for use by <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementations. (For
1311      instance, <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a> contains a <code class="computeroutput"><span class="identifier">ready_queue_t</span></code>
1312      instance to manage its ready fibers.) See <a class="link" href="scheduling.html#context_ready_is_linked"><code class="computeroutput">context::ready_is_linked()</code></a>,
1313      <a class="link" href="scheduling.html#context_ready_link"><code class="computeroutput">context::ready_link()</code></a>, <a class="link" href="scheduling.html#context_ready_unlink"><code class="computeroutput">context::ready_unlink()</code></a>.
1314    </p>
1315<p>
1316      Your <code class="computeroutput"><span class="identifier">algorithm</span></code> implementation
1317      may use any container you desire to manage passed <code class="computeroutput"><span class="identifier">context</span></code>
1318      instances. <code class="computeroutput"><span class="identifier">ready_queue_t</span></code> avoids
1319      some of the overhead of typical STL containers.
1320    </p>
1321<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">fiber</span><span class="special">/</span><span class="identifier">context</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
1322
1323<span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
1324<span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
1325
1326<span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">type</span> <span class="special">{</span>
1327  <span class="identifier">none</span>               <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span><span class="special">,</span>
1328  <span class="identifier">main_context</span>       <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span><span class="special">,</span> <span class="comment">// fiber associated with thread's stack</span>
1329  <span class="identifier">dispatcher_context</span> <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span><span class="special">,</span> <span class="comment">// special fiber for maintenance operations</span>
1330  <span class="identifier">worker_context</span>     <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span><span class="special">,</span> <span class="comment">// fiber not special to the library</span>
1331  <span class="identifier">pinned_context</span>     <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span>  <span class="comment">// fiber must not be migrated to another thread</span>
1332<span class="special">};</span>
1333
1334<span class="keyword">class</span> <span class="identifier">context</span> <span class="special">{</span>
1335<span class="keyword">public</span><span class="special">:</span>
1336    <span class="keyword">class</span> <span class="identifier">id</span><span class="special">;</span>
1337
1338    <span class="keyword">static</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">active</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1339
1340    <span class="identifier">context</span><span class="special">(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
1341    <span class="identifier">context</span> <span class="special">&amp;</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
1342
1343    <span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1344
1345    <span class="keyword">void</span> <span class="identifier">detach</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1346    <span class="keyword">void</span> <span class="identifier">attach</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1347
1348    <span class="keyword">bool</span> <span class="identifier">is_context</span><span class="special">(</span> <span class="identifier">type</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1349
1350    <span class="keyword">bool</span> <span class="identifier">is_terminated</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1351
1352    <span class="keyword">bool</span> <span class="identifier">ready_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1353    <span class="keyword">bool</span> <span class="identifier">remote_ready_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1354    <span class="keyword">bool</span> <span class="identifier">wait_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1355
1356    <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1357    <span class="keyword">void</span> <span class="identifier">ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1358    <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1359    <span class="keyword">void</span> <span class="identifier">remote_ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1360    <span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1361    <span class="keyword">void</span> <span class="identifier">wait_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1362
1363    <span class="keyword">void</span> <span class="identifier">ready_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1364    <span class="keyword">void</span> <span class="identifier">remote_ready_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1365    <span class="keyword">void</span> <span class="identifier">wait_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1366
1367    <span class="keyword">void</span> <span class="identifier">suspend</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1368    <span class="keyword">void</span> <span class="identifier">schedule</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1369<span class="special">};</span>
1370
1371<span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1372
1373<span class="special">}}</span>
1374</pre>
1375<p>
1376      </p>
1377<h5>
1378<a name="context_active_bridgehead"></a>
1379  <span class="phrase"><a name="context_active"></a></span>
1380  <a class="link" href="scheduling.html#context_active">Static member function
1381      <code class="computeroutput">active</code>()</a>
1382</h5>
1383<p>
1384    </p>
1385<pre class="programlisting"><span class="keyword">static</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">active</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1386</pre>
1387<div class="variablelist">
1388<p class="title"><b></b></p>
1389<dl class="variablelist">
1390<dt><span class="term">Returns:</span></dt>
1391<dd><p>
1392            Pointer to instance of current fiber.
1393          </p></dd>
1394<dt><span class="term">Throws:</span></dt>
1395<dd><p>
1396            Nothing
1397          </p></dd>
1398</dl>
1399</div>
1400<p>
1401      </p>
1402<h5>
1403<a name="context_get_id_bridgehead"></a>
1404  <span class="phrase"><a name="context_get_id"></a></span>
1405  <a class="link" href="scheduling.html#context_get_id">Member function <code class="computeroutput">get_id</code>()</a>
1406</h5>
1407<p>
1408    </p>
1409<pre class="programlisting"><span class="identifier">context</span><span class="special">::</span><span class="identifier">id</span> <span class="identifier">get_id</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1410</pre>
1411<div class="variablelist">
1412<p class="title"><b></b></p>
1413<dl class="variablelist">
1414<dt><span class="term">Returns:</span></dt>
1415<dd><p>
1416            If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1417            refers to a fiber of execution, an instance of <a class="link" href="fiber_mgmt.html#class_fiber_id"><code class="computeroutput"><span class="identifier">fiber</span><span class="special">::</span><span class="identifier">id</span></code></a> that represents that fiber. Otherwise
1418            returns a default-constructed <a class="link" href="fiber_mgmt.html#class_fiber_id"><code class="computeroutput"><span class="identifier">fiber</span><span class="special">::</span><span class="identifier">id</span></code></a>.
1419          </p></dd>
1420<dt><span class="term">Throws:</span></dt>
1421<dd><p>
1422            Nothing
1423          </p></dd>
1424<dt><span class="term">See also:</span></dt>
1425<dd><p>
1426            <a class="link" href="fiber_mgmt/fiber.html#fiber_get_id"><code class="computeroutput">fiber::get_id()</code></a>
1427          </p></dd>
1428</dl>
1429</div>
1430<p>
1431      </p>
1432<h5>
1433<a name="context_attach_bridgehead"></a>
1434  <span class="phrase"><a name="context_attach"></a></span>
1435  <a class="link" href="scheduling.html#context_attach">Member function <code class="computeroutput">attach</code>()</a>
1436</h5>
1437<p>
1438    </p>
1439<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">attach</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">f</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1440</pre>
1441<div class="variablelist">
1442<p class="title"><b></b></p>
1443<dl class="variablelist">
1444<dt><span class="term">Precondition:</span></dt>
1445<dd><p>
1446            <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span>
1447            <span class="special">==</span> <span class="keyword">nullptr</span></code>
1448          </p></dd>
1449<dt><span class="term">Effects:</span></dt>
1450<dd><p>
1451            Attach fiber <code class="computeroutput"><span class="identifier">f</span></code> to scheduler
1452            running <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1453          </p></dd>
1454<dt><span class="term">Postcondition:</span></dt>
1455<dd><p>
1456            <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span>
1457            <span class="special">!=</span> <span class="keyword">nullptr</span></code>
1458          </p></dd>
1459<dt><span class="term">Throws:</span></dt>
1460<dd><p>
1461            Nothing
1462          </p></dd>
1463<dt><span class="term">Note:</span></dt>
1464<dd><p>
1465            A typical call: <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">context</span><span class="special">::</span><span class="identifier">active</span><span class="special">()-&gt;</span><span class="identifier">attach</span><span class="special">(</span><span class="identifier">f</span><span class="special">);</span></code>
1466          </p></dd>
1467<dt><span class="term">Note:</span></dt>
1468<dd><p>
1469            <code class="computeroutput"><span class="identifier">f</span></code> must not be the running
1470            fiber’s context. It must not be <a class="link" href="overview.html#blocking"><span class="emphasis"><em>blocked</em></span></a>
1471            or terminated. It must not be a <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1472            It must be currently detached. It must not currently be linked into an
1473            <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementation’s ready queue. Most of these conditions
1474            are implied by <code class="computeroutput"><span class="identifier">f</span></code> being
1475            owned by an <code class="computeroutput"><span class="identifier">algorithm</span></code>
1476            implementation: that is, it has been passed to <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a> but
1477            has not yet been returned by <a class="link" href="scheduling.html#algorithm_pick_next"><code class="computeroutput">algorithm::pick_next()</code></a>.
1478            Typically a <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code> implementation would call <code class="computeroutput"><span class="identifier">attach</span><span class="special">()</span></code>
1479            with the <code class="computeroutput"><span class="identifier">context</span><span class="special">*</span></code>
1480            it is about to return. It must first remove <code class="computeroutput"><span class="identifier">f</span></code>
1481            from its ready queue. You should never pass a <code class="computeroutput"><span class="identifier">pinned_context</span></code>
1482            to <code class="computeroutput"><span class="identifier">attach</span><span class="special">()</span></code>
1483            because you should never have called its <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code> method in the first place.
1484          </p></dd>
1485</dl>
1486</div>
1487<p>
1488      </p>
1489<h5>
1490<a name="context_detach_bridgehead"></a>
1491  <span class="phrase"><a name="context_detach"></a></span>
1492  <a class="link" href="scheduling.html#context_detach">Member function <code class="computeroutput">detach</code>()</a>
1493</h5>
1494<p>
1495    </p>
1496<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">detach</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1497</pre>
1498<div class="variablelist">
1499<p class="title"><b></b></p>
1500<dl class="variablelist">
1501<dt><span class="term">Precondition:</span></dt>
1502<dd><p>
1503            <code class="computeroutput"><span class="special">(</span><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span> <span class="special">!=</span> <span class="keyword">nullptr</span><span class="special">)</span> <span class="special">&amp;&amp;</span> <span class="special">!</span>
1504            <span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">is_context</span><span class="special">(</span><span class="identifier">pinned_context</span><span class="special">)</span></code>
1505          </p></dd>
1506<dt><span class="term">Effects:</span></dt>
1507<dd><p>
1508            Detach fiber <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1509            from its scheduler running <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1510          </p></dd>
1511<dt><span class="term">Throws:</span></dt>
1512<dd><p>
1513            Nothing
1514          </p></dd>
1515<dt><span class="term">Postcondition:</span></dt>
1516<dd><p>
1517            <code class="computeroutput"><span class="keyword">this</span><span class="special">-&gt;</span><span class="identifier">get_scheduler</span><span class="special">()</span>
1518            <span class="special">==</span> <span class="keyword">nullptr</span></code>
1519          </p></dd>
1520<dt><span class="term">Note:</span></dt>
1521<dd><p>
1522            This method must be called on the thread with which the fiber is currently
1523            associated. <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1524            must not be the running fiber’s context. It must not be <a class="link" href="overview.html#blocking"><span class="emphasis"><em>blocked</em></span></a>
1525            or terminated. It must not be a <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1526            It must not be detached already. It must not already be linked into an
1527            <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementation’s ready queue. Most of these conditions
1528            are implied by <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1529            being passed to <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a>; an <code class="computeroutput"><span class="identifier">awakened</span><span class="special">()</span></code>
1530            implementation must, however, test for <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1531            It must call <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code>
1532            <span class="emphasis"><em>before</em></span> linking <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> into its ready queue.
1533          </p></dd>
1534<dt><span class="term">Note:</span></dt>
1535<dd><p>
1536            In particular, it is erroneous to attempt to migrate a fiber from one
1537            thread to another by calling both <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code> and <code class="computeroutput"><span class="identifier">attach</span><span class="special">()</span></code> in the <a class="link" href="scheduling.html#algorithm_pick_next"><code class="computeroutput">algorithm::pick_next()</code></a> method.
1538            <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code>
1539            is called on the intended destination thread. <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code> must be called on the fiber’s original
1540            thread. You must call <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code> in the corresponding <code class="computeroutput"><span class="identifier">awakened</span><span class="special">()</span></code>
1541            method.
1542          </p></dd>
1543<dt><span class="term">Note:</span></dt>
1544<dd><p>
1545            Unless you intend make a fiber available for potential migration to a
1546            different thread, you should call neither <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code> nor <code class="computeroutput"><span class="identifier">attach</span><span class="special">()</span></code> with its <code class="computeroutput"><span class="identifier">context</span></code>.
1547          </p></dd>
1548</dl>
1549</div>
1550<p>
1551      </p>
1552<h5>
1553<a name="context_is_context_bridgehead"></a>
1554  <span class="phrase"><a name="context_is_context"></a></span>
1555  <a class="link" href="scheduling.html#context_is_context">Member function
1556      <code class="computeroutput">is_context</code>()</a>
1557</h5>
1558<p>
1559    </p>
1560<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_context</span><span class="special">(</span> <span class="identifier">type</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1561</pre>
1562<div class="variablelist">
1563<p class="title"><b></b></p>
1564<dl class="variablelist">
1565<dt><span class="term">Returns:</span></dt>
1566<dd><p>
1567            <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is of the specified type.
1568          </p></dd>
1569<dt><span class="term">Throws:</span></dt>
1570<dd><p>
1571            Nothing
1572          </p></dd>
1573<dt><span class="term">Note:</span></dt>
1574<dd><p>
1575            <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="identifier">worker_context</span></code> here means any fiber
1576            not special to the library. For <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="identifier">main_context</span></code>
1577            the <code class="computeroutput"><span class="identifier">context</span></code> is associated
1578            with the <span class="quote">“<span class="quote">main</span>”</span> fiber of the thread: the one implicitly
1579            created by the thread itself, rather than one explicitly created by
1580            <span class="bold"><strong>Boost.Fiber</strong></span>. For <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="identifier">dispatcher_context</span></code>
1581            the <code class="computeroutput"><span class="identifier">context</span></code> is associated
1582            with a <span class="quote">“<span class="quote">dispatching</span>”</span> fiber, responsible for dispatching
1583            awakened fibers to a scheduler’s ready-queue. The <span class="quote">“<span class="quote">dispatching</span>”</span>
1584            fiber is an implementation detail of the fiber manager. The context of
1585            the <span class="quote">“<span class="quote">main</span>”</span> or <span class="quote">“<span class="quote">dispatching</span>”</span> fiber — any fiber
1586            for which <code class="computeroutput"><span class="identifier">is_context</span><span class="special">(</span><span class="identifier">pinned_context</span><span class="special">)</span></code> is <code class="computeroutput"><span class="keyword">true</span></code>
1587            — must never be passed to <a class="link" href="scheduling.html#context_detach"><code class="computeroutput">context::detach()</code></a>.
1588          </p></dd>
1589</dl>
1590</div>
1591<p>
1592      </p>
1593<h5>
1594<a name="context_is_terminated_bridgehead"></a>
1595  <span class="phrase"><a name="context_is_terminated"></a></span>
1596  <a class="link" href="scheduling.html#context_is_terminated">Member
1597      function <code class="computeroutput">is_terminated</code>()</a>
1598</h5>
1599<p>
1600    </p>
1601<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">is_terminated</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1602</pre>
1603<div class="variablelist">
1604<p class="title"><b></b></p>
1605<dl class="variablelist">
1606<dt><span class="term">Returns:</span></dt>
1607<dd><p>
1608            <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is no longer a valid context.
1609          </p></dd>
1610<dt><span class="term">Throws:</span></dt>
1611<dd><p>
1612            Nothing
1613          </p></dd>
1614<dt><span class="term">Note:</span></dt>
1615<dd><p>
1616            The <code class="computeroutput"><span class="identifier">context</span></code> has returned
1617            from its fiber-function and is no longer considered a valid context.
1618          </p></dd>
1619</dl>
1620</div>
1621<p>
1622      </p>
1623<h5>
1624<a name="context_ready_is_linked_bridgehead"></a>
1625  <span class="phrase"><a name="context_ready_is_linked"></a></span>
1626  <a class="link" href="scheduling.html#context_ready_is_linked">Member
1627      function <code class="computeroutput">ready_is_linked</code>()</a>
1628</h5>
1629<p>
1630    </p>
1631<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">ready_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1632</pre>
1633<div class="variablelist">
1634<p class="title"><b></b></p>
1635<dl class="variablelist">
1636<dt><span class="term">Returns:</span></dt>
1637<dd><p>
1638            <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is stored in an <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>
1639implementation’s
1640            ready-queue.
1641          </p></dd>
1642<dt><span class="term">Throws:</span></dt>
1643<dd><p>
1644            Nothing
1645          </p></dd>
1646<dt><span class="term">Note:</span></dt>
1647<dd><p>
1648            Specifically, this method indicates whether <a class="link" href="scheduling.html#context_ready_link"><code class="computeroutput">context::ready_link()</code></a> has
1649            been called on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1650            <code class="computeroutput"><span class="identifier">ready_is_linked</span><span class="special">()</span></code>
1651            has no information about participation in any other containers.
1652          </p></dd>
1653</dl>
1654</div>
1655<p>
1656      </p>
1657<h5>
1658<a name="context_remote_ready_is_linked_bridgehead"></a>
1659  <span class="phrase"><a name="context_remote_ready_is_linked"></a></span>
1660  <a class="link" href="scheduling.html#context_remote_ready_is_linked">Member
1661      function <code class="computeroutput">remote_ready_is_linked</code>()</a>
1662</h5>
1663<p>
1664    </p>
1665<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">remote_ready_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1666</pre>
1667<div class="variablelist">
1668<p class="title"><b></b></p>
1669<dl class="variablelist">
1670<dt><span class="term">Returns:</span></dt>
1671<dd><p>
1672            <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is stored in the fiber manager’s remote-ready-queue.
1673          </p></dd>
1674<dt><span class="term">Throws:</span></dt>
1675<dd><p>
1676            Nothing
1677          </p></dd>
1678<dt><span class="term">Note:</span></dt>
1679<dd><p>
1680            A <code class="computeroutput"><span class="identifier">context</span></code> signaled as
1681            ready by another thread is first stored in the fiber manager’s remote-ready-queue.
1682            This is the mechanism by which the fiber manager protects an <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementation
1683            from cross-thread <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a> calls.
1684          </p></dd>
1685</dl>
1686</div>
1687<p>
1688      </p>
1689<h5>
1690<a name="context_wait_is_linked_bridgehead"></a>
1691  <span class="phrase"><a name="context_wait_is_linked"></a></span>
1692  <a class="link" href="scheduling.html#context_wait_is_linked">Member
1693      function <code class="computeroutput">wait_is_linked</code>()</a>
1694</h5>
1695<p>
1696    </p>
1697<pre class="programlisting"><span class="keyword">bool</span> <span class="identifier">wait_is_linked</span><span class="special">()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span><span class="special">;</span>
1698</pre>
1699<div class="variablelist">
1700<p class="title"><b></b></p>
1701<dl class="variablelist">
1702<dt><span class="term">Returns:</span></dt>
1703<dd><p>
1704            <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> is stored in the wait-queue of some
1705            synchronization object.
1706          </p></dd>
1707<dt><span class="term">Throws:</span></dt>
1708<dd><p>
1709            Nothing
1710          </p></dd>
1711<dt><span class="term">Note:</span></dt>
1712<dd><p>
1713            The <code class="computeroutput"><span class="identifier">context</span></code> of a fiber
1714            waiting on a synchronization object (e.g. <code class="computeroutput"><span class="identifier">mutex</span></code>,
1715            <code class="computeroutput"><span class="identifier">condition_variable</span></code> etc.)
1716            is stored in the wait-queue of that synchronization object.
1717          </p></dd>
1718</dl>
1719</div>
1720<p>
1721      </p>
1722<h5>
1723<a name="context_ready_link_bridgehead"></a>
1724  <span class="phrase"><a name="context_ready_link"></a></span>
1725  <a class="link" href="scheduling.html#context_ready_link">Member function
1726      <code class="computeroutput">ready_link</code>()</a>
1727</h5>
1728<p>
1729    </p>
1730<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1731<span class="keyword">void</span> <span class="identifier">ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;</span> <span class="identifier">lst</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1732</pre>
1733<div class="variablelist">
1734<p class="title"><b></b></p>
1735<dl class="variablelist">
1736<dt><span class="term">Effects:</span></dt>
1737<dd><p>
1738            Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1739            in ready-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1740          </p></dd>
1741<dt><span class="term">Throws:</span></dt>
1742<dd><p>
1743            Nothing
1744          </p></dd>
1745<dt><span class="term">Note:</span></dt>
1746<dd><p>
1747            Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1748            a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>,
1749            e.g. an instance of <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">fibers</span><span class="special">::</span><span class="identifier">scheduler</span><span class="special">::</span><span class="identifier">ready_queue_t</span></code>.
1750            Specifically, it must be a <a href="http://www.boost.org/doc/libs/release/doc/html/intrusive/list.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">intrusive</span><span class="special">::</span><span class="identifier">list</span></code></a> compatible with the <code class="computeroutput"><span class="identifier">list_member_hook</span></code> stored in the <code class="computeroutput"><span class="identifier">context</span></code> object.
1751          </p></dd>
1752</dl>
1753</div>
1754<p>
1755      </p>
1756<h5>
1757<a name="context_remote_ready_link_bridgehead"></a>
1758  <span class="phrase"><a name="context_remote_ready_link"></a></span>
1759  <a class="link" href="scheduling.html#context_remote_ready_link">Member
1760      function <code class="computeroutput">remote_ready_link</code>()</a>
1761</h5>
1762<p>
1763    </p>
1764<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1765<span class="keyword">void</span> <span class="identifier">remote_ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;</span> <span class="identifier">lst</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1766</pre>
1767<div class="variablelist">
1768<p class="title"><b></b></p>
1769<dl class="variablelist">
1770<dt><span class="term">Effects:</span></dt>
1771<dd><p>
1772            Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1773            in remote-ready-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1774          </p></dd>
1775<dt><span class="term">Throws:</span></dt>
1776<dd><p>
1777            Nothing
1778          </p></dd>
1779<dt><span class="term">Note:</span></dt>
1780<dd><p>
1781            Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1782            a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>.
1783          </p></dd>
1784</dl>
1785</div>
1786<p>
1787      </p>
1788<h5>
1789<a name="context_wait_link_bridgehead"></a>
1790  <span class="phrase"><a name="context_wait_link"></a></span>
1791  <a class="link" href="scheduling.html#context_wait_link">Member function
1792      <code class="computeroutput">wait_link</code>()</a>
1793</h5>
1794<p>
1795    </p>
1796<pre class="programlisting"><span class="keyword">template</span><span class="special">&lt;</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">&gt;</span>
1797<span class="keyword">void</span> <span class="identifier">wait_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&amp;</span> <span class="identifier">lst</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1798</pre>
1799<div class="variablelist">
1800<p class="title"><b></b></p>
1801<dl class="variablelist">
1802<dt><span class="term">Effects:</span></dt>
1803<dd><p>
1804            Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1805            in wait-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1806          </p></dd>
1807<dt><span class="term">Throws:</span></dt>
1808<dd><p>
1809            Nothing
1810          </p></dd>
1811<dt><span class="term">Note:</span></dt>
1812<dd><p>
1813            Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1814            a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>.
1815          </p></dd>
1816</dl>
1817</div>
1818<p>
1819      </p>
1820<h5>
1821<a name="context_ready_unlink_bridgehead"></a>
1822  <span class="phrase"><a name="context_ready_unlink"></a></span>
1823  <a class="link" href="scheduling.html#context_ready_unlink">Member
1824      function <code class="computeroutput">ready_unlink</code>()</a>
1825</h5>
1826<p>
1827    </p>
1828<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">ready_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1829</pre>
1830<div class="variablelist">
1831<p class="title"><b></b></p>
1832<dl class="variablelist">
1833<dt><span class="term">Effects:</span></dt>
1834<dd><p>
1835            Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1836            from ready-queue: undoes the effect of <a class="link" href="scheduling.html#context_ready_link"><code class="computeroutput">context::ready_link()</code></a>.
1837          </p></dd>
1838<dt><span class="term">Throws:</span></dt>
1839<dd><p>
1840            Nothing
1841          </p></dd>
1842</dl>
1843</div>
1844<p>
1845      </p>
1846<h5>
1847<a name="context_remote_ready_unlink_bridgehead"></a>
1848  <span class="phrase"><a name="context_remote_ready_unlink"></a></span>
1849  <a class="link" href="scheduling.html#context_remote_ready_unlink">Member
1850      function <code class="computeroutput">remote_ready_unlink</code>()</a>
1851</h5>
1852<p>
1853    </p>
1854<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">remote_ready_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1855</pre>
1856<div class="variablelist">
1857<p class="title"><b></b></p>
1858<dl class="variablelist">
1859<dt><span class="term">Effects:</span></dt>
1860<dd><p>
1861            Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1862            from remote-ready-queue.
1863          </p></dd>
1864<dt><span class="term">Throws:</span></dt>
1865<dd><p>
1866            Nothing
1867          </p></dd>
1868</dl>
1869</div>
1870<p>
1871      </p>
1872<h5>
1873<a name="context_wait_unlink_bridgehead"></a>
1874  <span class="phrase"><a name="context_wait_unlink"></a></span>
1875  <a class="link" href="scheduling.html#context_wait_unlink">Member
1876      function <code class="computeroutput">wait_unlink</code>()</a>
1877</h5>
1878<p>
1879    </p>
1880<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">wait_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1881</pre>
1882<div class="variablelist">
1883<p class="title"><b></b></p>
1884<dl class="variablelist">
1885<dt><span class="term">Effects:</span></dt>
1886<dd><p>
1887            Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1888            from wait-queue.
1889          </p></dd>
1890<dt><span class="term">Throws:</span></dt>
1891<dd><p>
1892            Nothing
1893          </p></dd>
1894</dl>
1895</div>
1896<p>
1897      </p>
1898<h5>
1899<a name="context_suspend_bridgehead"></a>
1900  <span class="phrase"><a name="context_suspend"></a></span>
1901  <a class="link" href="scheduling.html#context_suspend">Member function <code class="computeroutput">suspend</code>()</a>
1902</h5>
1903<p>
1904    </p>
1905<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">suspend</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1906</pre>
1907<div class="variablelist">
1908<p class="title"><b></b></p>
1909<dl class="variablelist">
1910<dt><span class="term">Effects:</span></dt>
1911<dd><p>
1912            Suspends the running fiber (the fiber associated with <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>) until some other fiber passes <code class="computeroutput"><span class="keyword">this</span></code> to <a class="link" href="scheduling.html#context_schedule"><code class="computeroutput">context::schedule()</code></a>.
1913            <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1914            is marked as not-ready, and control passes to the scheduler to select
1915            another fiber to run.
1916          </p></dd>
1917<dt><span class="term">Throws:</span></dt>
1918<dd><p>
1919            Nothing
1920          </p></dd>
1921<dt><span class="term">Note:</span></dt>
1922<dd><p>
1923            This is a low-level API potentially useful for integration with other
1924            frameworks. It is not intended to be directly invoked by a typical application
1925            program.
1926          </p></dd>
1927<dt><span class="term">Note:</span></dt>
1928<dd><p>
1929            The burden is on the caller to arrange for a call to <code class="computeroutput"><span class="identifier">schedule</span><span class="special">()</span></code> with a pointer to <code class="computeroutput"><span class="keyword">this</span></code>
1930            at some future time.
1931          </p></dd>
1932</dl>
1933</div>
1934<p>
1935      </p>
1936<h5>
1937<a name="context_schedule_bridgehead"></a>
1938  <span class="phrase"><a name="context_schedule"></a></span>
1939  <a class="link" href="scheduling.html#context_schedule">Member function
1940      <code class="computeroutput">schedule</code>()</a>
1941</h5>
1942<p>
1943    </p>
1944<pre class="programlisting"><span class="keyword">void</span> <span class="identifier">schedule</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*</span> <span class="identifier">ctx</span> <span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1945</pre>
1946<div class="variablelist">
1947<p class="title"><b></b></p>
1948<dl class="variablelist">
1949<dt><span class="term">Effects:</span></dt>
1950<dd><p>
1951            Mark the fiber associated with context <code class="computeroutput"><span class="special">*</span><span class="identifier">ctx</span></code> as being ready to run. This does
1952            not immediately resume that fiber; rather it passes the fiber to the
1953            scheduler for subsequent resumption. If the scheduler is idle (has not
1954            returned from a call to <a class="link" href="scheduling.html#algorithm_suspend_until"><code class="computeroutput">algorithm::suspend_until()</code></a>),
1955            <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a> is called to wake it up.
1956          </p></dd>
1957<dt><span class="term">Throws:</span></dt>
1958<dd><p>
1959            Nothing
1960          </p></dd>
1961<dt><span class="term">Note:</span></dt>
1962<dd><p>
1963            This is a low-level API potentially useful for integration with other
1964            frameworks. It is not intended to be directly invoked by a typical application
1965            program.
1966          </p></dd>
1967<dt><span class="term">Note:</span></dt>
1968<dd><p>
1969            It is explicitly supported to call <code class="computeroutput"><span class="identifier">schedule</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">)</span></code> from a thread other than the one on
1970            which <code class="computeroutput"><span class="special">*</span><span class="identifier">ctx</span></code>
1971            is currently suspended. The corresponding fiber will be resumed on its
1972            original thread in due course.
1973          </p></dd>
1974</dl>
1975</div>
1976<p>
1977      </p>
1978<h5>
1979<a name="context_less_bridgehead"></a>
1980  <span class="phrase"><a name="context_less"></a></span>
1981  <a class="link" href="scheduling.html#context_less">Non-member function <code class="computeroutput">operator&lt;()</code></a>
1982</h5>
1983<p>
1984    </p>
1985<pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">r</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1986</pre>
1987<div class="variablelist">
1988<p class="title"><b></b></p>
1989<dl class="variablelist">
1990<dt><span class="term">Returns:</span></dt>
1991<dd><p>
1992            <code class="computeroutput"><span class="keyword">true</span></code> if <code class="computeroutput"><span class="identifier">l</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span> <span class="special">&lt;</span> <span class="identifier">r</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span></code>
1993            is <code class="computeroutput"><span class="keyword">true</span></code>, <code class="computeroutput"><span class="keyword">false</span></code>
1994            otherwise.
1995          </p></dd>
1996<dt><span class="term">Throws:</span></dt>
1997<dd><p>
1998            Nothing.
1999          </p></dd>
2000</dl>
2001</div>
2002</div>
2003<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
2004<td align="left"></td>
2005<td align="right"><div class="copyright-footer">Copyright © 2013 Oliver Kowalke<p>
2006        Distributed under the Boost Software License, Version 1.0. (See accompanying
2007        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>)
2008      </p>
2009</div></td>
2010</tr></table>
2011<hr>
2012<div class="spirit-nav">
2013<a accesskey="p" href="fiber_mgmt/this_fiber.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="stack.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a>
2014</div>
2015</body>
2016</html>
2017