3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
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">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="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>
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>
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.
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>.)
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.
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.
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>:
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"><</span> <span class="identifier">my_fiber_scheduler</span> <span class="special">>();</span>
59 <span class="special">...</span>
60 <span class="special">}</span>
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 one scheduler: <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a>.
68 <a name="class_algorithm_bridgehead"></a>
69 <span class="phrase"><a name="class_algorithm"></a></span>
70 <a class="link" href="scheduling.html#class_algorithm">Class <code class="computeroutput">algorithm</code></a>
75 <code class="computeroutput"><span class="identifier">algorithm</span></code> is the abstract base
76 class defining the interface that a fiber scheduler must implement.
78 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></span>
80 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
81 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
82 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
84 <span class="keyword">struct</span> <span class="identifier">algorithm</span> <span class="special">{</span>
85 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">algorithm</span><span class="special">();</span>
87 <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>
89 <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>
91 <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>
93 <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">&)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
95 <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>
96 <span class="special">};</span>
98 <span class="special">}}}</span>
103 <a name="algorithm_awakened_bridgehead"></a>
104 <span class="phrase"><a name="algorithm_awakened"></a></span>
105 <a class="link" href="scheduling.html#algorithm_awakened">Member function
106 <code class="computeroutput">awakened</code>()</a>
110 <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>
112 <div class="variablelist">
113 <p class="title"><b></b></p>
114 <dl class="variablelist">
115 <dt><span class="term">Effects:</span></dt>
117 Informs the scheduler that fiber <code class="computeroutput"><span class="identifier">f</span></code>
118 is ready to run. Fiber <code class="computeroutput"><span class="identifier">f</span></code>
119 might be newly launched, or it might have been blocked but has just been
120 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>.
122 <dt><span class="term">Note:</span></dt>
124 This method advises the scheduler to add fiber <code class="computeroutput"><span class="identifier">f</span></code>
125 to its collection of fibers ready to run. A typical scheduler implementation
126 places <code class="computeroutput"><span class="identifier">f</span></code> into a queue.
128 <dt><span class="term">See also:</span></dt>
130 <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a>
137 <a name="algorithm_pick_next_bridgehead"></a>
138 <span class="phrase"><a name="algorithm_pick_next"></a></span>
139 <a class="link" href="scheduling.html#algorithm_pick_next">Member
140 function <code class="computeroutput">pick_next</code>()</a>
144 <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>
146 <div class="variablelist">
147 <p class="title"><b></b></p>
148 <dl class="variablelist">
149 <dt><span class="term">Returns:</span></dt>
151 the fiber which is to be resumed next, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
152 if there is no ready fiber.
154 <dt><span class="term">Note:</span></dt>
156 This is where the scheduler actually specifies the fiber which is to
157 run next. A typical scheduler implementation chooses the head of the
160 <dt><span class="term">See also:</span></dt>
162 <a class="link" href="scheduling.html#class_round_robin"><code class="computeroutput">round_robin</code></a>
169 <a name="algorithm_has_ready_fibers_bridgehead"></a>
170 <span class="phrase"><a name="algorithm_has_ready_fibers"></a></span>
171 <a class="link" href="scheduling.html#algorithm_has_ready_fibers">Member
172 function <code class="computeroutput">has_ready_fibers</code>()</a>
176 <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>
178 <div class="variablelist">
179 <p class="title"><b></b></p>
180 <dl class="variablelist">
181 <dt><span class="term">Returns:</span></dt>
183 <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
191 <a name="algorithm_suspend_until_bridgehead"></a>
192 <span class="phrase"><a name="algorithm_suspend_until"></a></span>
193 <a class="link" href="scheduling.html#algorithm_suspend_until">Member
194 function <code class="computeroutput">suspend_until</code>()</a>
198 <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">&</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>
200 <div class="variablelist">
201 <p class="title"><b></b></p>
202 <dl class="variablelist">
203 <dt><span class="term">Effects:</span></dt>
205 Informs the scheduler that no fiber will be ready until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
207 <dt><span class="term">Note:</span></dt>
209 This method allows a custom scheduler to yield control to the containing
210 environment in whatever way makes sense. The fiber manager is stating
211 that <code class="computeroutput"><span class="identifier">suspend_until</span><span class="special">()</span></code>
212 need not return until <code class="computeroutput"><span class="identifier">abs_time</span></code>
213 — or <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a> is called — whichever comes first.
214 The interaction with <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> means that, for instance, calling
215 <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>
216 would be too simplistic. <a class="link" href="scheduling.html#round_robin_suspend_until"><code class="computeroutput">round_robin::suspend_until()</code></a> uses
217 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
218 with <a class="link" href="scheduling.html#round_robin_notify"><code class="computeroutput">round_robin::notify()</code></a>.
220 <dt><span class="term">Note:</span></dt>
222 Given that <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code>
223 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
224 <code class="computeroutput"><span class="identifier">algorithm</span></code> implementation
225 — must guard any data it shares with your <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> implementation.
232 <a name="algorithm_notify_bridgehead"></a>
233 <span class="phrase"><a name="algorithm_notify"></a></span>
234 <a class="link" href="scheduling.html#algorithm_notify">Member function
235 <code class="computeroutput">notify</code>()</a>
239 <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>
241 <div class="variablelist">
242 <p class="title"><b></b></p>
243 <dl class="variablelist">
244 <dt><span class="term">Effects:</span></dt>
246 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>.
248 <dt><span class="term">Note:</span></dt>
250 Alone among the <code class="computeroutput"><span class="identifier">algorithm</span></code>
251 methods, <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code>
252 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
253 it shares with the rest of your <code class="computeroutput"><span class="identifier">algorithm</span></code>
261 <a name="class_round_robin_bridgehead"></a>
262 <span class="phrase"><a name="class_round_robin"></a></span>
263 <a class="link" href="scheduling.html#class_round_robin">Class <code class="computeroutput">round_robin</code></a>
268 This class implements <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>, scheduling fibers in round-robin
271 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></span>
273 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
274 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
275 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
277 <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>
278 <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>
280 <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>
282 <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>
284 <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">&)</span> <span class="keyword">noexcept</span><span class="special">;</span>
286 <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>
287 <span class="special">};</span>
289 <span class="special">}}}</span>
294 <a name="round_robin_awakened_bridgehead"></a>
295 <span class="phrase"><a name="round_robin_awakened"></a></span>
296 <a class="link" href="scheduling.html#round_robin_awakened">Member
297 function <code class="computeroutput">awakened</code>()</a>
301 <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>
303 <div class="variablelist">
304 <p class="title"><b></b></p>
305 <dl class="variablelist">
306 <dt><span class="term">Effects:</span></dt>
308 Enqueues fiber <code class="computeroutput"><span class="identifier">f</span></code> onto
311 <dt><span class="term">Throws:</span></dt>
320 <a name="round_robin_pick_next_bridgehead"></a>
321 <span class="phrase"><a name="round_robin_pick_next"></a></span>
322 <a class="link" href="scheduling.html#round_robin_pick_next">Member
323 function <code class="computeroutput">pick_next</code>()</a>
327 <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>
329 <div class="variablelist">
330 <p class="title"><b></b></p>
331 <dl class="variablelist">
332 <dt><span class="term">Returns:</span></dt>
334 the fiber at the head of the ready queue, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
335 if the queue is empty.
337 <dt><span class="term">Throws:</span></dt>
341 <dt><span class="term">Note:</span></dt>
343 Placing ready fibers onto the tail of a queue, and returning them from
344 the head of that queue, shares the thread between ready fibers in round-robin
352 <a name="round_robin_has_ready_fibers_bridgehead"></a>
353 <span class="phrase"><a name="round_robin_has_ready_fibers"></a></span>
354 <a class="link" href="scheduling.html#round_robin_has_ready_fibers">Member
355 function <code class="computeroutput">has_ready_fibers</code>()</a>
359 <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>
361 <div class="variablelist">
362 <p class="title"><b></b></p>
363 <dl class="variablelist">
364 <dt><span class="term">Returns:</span></dt>
366 <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
369 <dt><span class="term">Throws:</span></dt>
378 <a name="round_robin_suspend_until_bridgehead"></a>
379 <span class="phrase"><a name="round_robin_suspend_until"></a></span>
380 <a class="link" href="scheduling.html#round_robin_suspend_until">Member
381 function <code class="computeroutput">suspend_until</code>()</a>
385 <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">&</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
387 <div class="variablelist">
388 <p class="title"><b></b></p>
389 <dl class="variablelist">
390 <dt><span class="term">Effects:</span></dt>
392 Informs <code class="computeroutput"><span class="identifier">round_robin</span></code> that
393 no ready fiber will be available until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
394 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>.
396 <dt><span class="term">Throws:</span></dt>
405 <a name="round_robin_notify_bridgehead"></a>
406 <span class="phrase"><a name="round_robin_notify"></a></span>
407 <a class="link" href="scheduling.html#round_robin_notify">Member function
408 <code class="computeroutput">notify</code>()</a>
412 <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>
414 <div class="variablelist">
415 <p class="title"><b></b></p>
416 <dl class="variablelist">
417 <dt><span class="term">Effects:</span></dt>
419 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>,
420 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>.
422 <dt><span class="term">Throws:</span></dt>
431 <a name="class_shared_work_bridgehead"></a>
432 <span class="phrase"><a name="class_shared_work"></a></span>
433 <a class="link" href="scheduling.html#class_shared_work">Class <code class="computeroutput">shared_work</code></a>
437 <div class="note"><table border="0" summary="Note">
439 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../doc/src/images/note.png"></td>
440 <th align="left">Note</th>
442 <tr><td align="left" valign="top"><p>
443 Because of the non-locality of data, <span class="emphasis"><em>shared_work</em></span> is
444 less performant than <span class="emphasis"><em>work_stealing</em></span>.
448 This class implements <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>, scheduling fibers in round-robin
449 fashion. Ready fibers are shared between all instances (running on different
450 threads) of shared_work, thus the work is distributed equally over all threads.
452 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></span>
454 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
455 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
456 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
458 <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>
459 <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>
461 <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>
463 <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>
465 <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">&)</span> <span class="keyword">noexcept</span><span class="special">;</span>
467 <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>
468 <span class="special">};</span>
470 <span class="special">}}}</span>
475 <a name="shared_work_awakened_bridgehead"></a>
476 <span class="phrase"><a name="shared_work_awakened"></a></span>
477 <a class="link" href="scheduling.html#shared_work_awakened">Member
478 function <code class="computeroutput">awakened</code>()</a>
482 <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>
484 <div class="variablelist">
485 <p class="title"><b></b></p>
486 <dl class="variablelist">
487 <dt><span class="term">Effects:</span></dt>
489 Enqueues fiber <code class="computeroutput"><span class="identifier">f</span></code> onto
490 the shared ready queue.
492 <dt><span class="term">Throws:</span></dt>
501 <a name="shared_work_pick_next_bridgehead"></a>
502 <span class="phrase"><a name="shared_work_pick_next"></a></span>
503 <a class="link" href="scheduling.html#shared_work_pick_next">Member
504 function <code class="computeroutput">pick_next</code>()</a>
508 <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>
510 <div class="variablelist">
511 <p class="title"><b></b></p>
512 <dl class="variablelist">
513 <dt><span class="term">Returns:</span></dt>
515 the fiber at the head of the ready queue, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
516 if the queue is empty.
518 <dt><span class="term">Throws:</span></dt>
522 <dt><span class="term">Note:</span></dt>
524 Placing ready fibers onto the tail of the shared queue, and returning
525 them from the head of that queue, shares the thread between ready fibers
526 in round-robin fashion.
533 <a name="shared_work_has_ready_fibers_bridgehead"></a>
534 <span class="phrase"><a name="shared_work_has_ready_fibers"></a></span>
535 <a class="link" href="scheduling.html#shared_work_has_ready_fibers">Member
536 function <code class="computeroutput">has_ready_fibers</code>()</a>
540 <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>
542 <div class="variablelist">
543 <p class="title"><b></b></p>
544 <dl class="variablelist">
545 <dt><span class="term">Returns:</span></dt>
547 <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
550 <dt><span class="term">Throws:</span></dt>
559 <a name="shared_work_suspend_until_bridgehead"></a>
560 <span class="phrase"><a name="shared_work_suspend_until"></a></span>
561 <a class="link" href="scheduling.html#shared_work_suspend_until">Member
562 function <code class="computeroutput">suspend_until</code>()</a>
566 <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">&</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
568 <div class="variablelist">
569 <p class="title"><b></b></p>
570 <dl class="variablelist">
571 <dt><span class="term">Effects:</span></dt>
573 Informs <code class="computeroutput"><span class="identifier">shared_work</span></code> that
574 no ready fiber will be available until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
575 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>.
577 <dt><span class="term">Throws:</span></dt>
586 <a name="shared_work_notify_bridgehead"></a>
587 <span class="phrase"><a name="shared_work_notify"></a></span>
588 <a class="link" href="scheduling.html#shared_work_notify">Member function
589 <code class="computeroutput">notify</code>()</a>
593 <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>
595 <div class="variablelist">
596 <p class="title"><b></b></p>
597 <dl class="variablelist">
598 <dt><span class="term">Effects:</span></dt>
600 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>,
601 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>.
603 <dt><span class="term">Throws:</span></dt>
612 <a name="class_work_stealing_bridgehead"></a>
613 <span class="phrase"><a name="class_work_stealing"></a></span>
614 <a class="link" href="scheduling.html#class_work_stealing">Class <code class="computeroutput">work_stealing</code></a>
619 This class implements <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a>; if the local ready-queue runs
620 out of ready fibers, ready fibers are stolen from other schedulers. The victim
621 scheduler (from which a ready fiber is stolen) is selected at random.
623 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></span>
625 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
626 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
627 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
629 <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>
630 <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>
632 <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>
634 <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>
636 <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">&)</span> <span class="keyword">noexcept</span><span class="special">;</span>
638 <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>
639 <span class="special">};</span>
641 <span class="special">}}}</span>
646 <a name="work_stealing_awakened_bridgehead"></a>
647 <span class="phrase"><a name="work_stealing_awakened"></a></span>
648 <a class="link" href="scheduling.html#work_stealing_awakened">Member
649 function <code class="computeroutput">awakened</code>()</a>
653 <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>
655 <div class="variablelist">
656 <p class="title"><b></b></p>
657 <dl class="variablelist">
658 <dt><span class="term">Effects:</span></dt>
660 Enqueues fiber <code class="computeroutput"><span class="identifier">f</span></code> onto
661 the shared ready queue.
663 <dt><span class="term">Throws:</span></dt>
672 <a name="work_stealing_pick_next_bridgehead"></a>
673 <span class="phrase"><a name="work_stealing_pick_next"></a></span>
674 <a class="link" href="scheduling.html#work_stealing_pick_next">Member
675 function <code class="computeroutput">pick_next</code>()</a>
679 <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>
681 <div class="variablelist">
682 <p class="title"><b></b></p>
683 <dl class="variablelist">
684 <dt><span class="term">Returns:</span></dt>
686 the fiber at the head of the ready queue, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
687 if the queue is empty.
689 <dt><span class="term">Throws:</span></dt>
693 <dt><span class="term">Note:</span></dt>
695 Placing ready fibers onto the tail of the sahred queue, and returning
696 them from the head of that queue, shares the thread between ready fibers
697 in round-robin fashion.
704 <a name="work_stealing_has_ready_fibers_bridgehead"></a>
705 <span class="phrase"><a name="work_stealing_has_ready_fibers"></a></span>
706 <a class="link" href="scheduling.html#work_stealing_has_ready_fibers">Member
707 function <code class="computeroutput">has_ready_fibers</code>()</a>
711 <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>
713 <div class="variablelist">
714 <p class="title"><b></b></p>
715 <dl class="variablelist">
716 <dt><span class="term">Returns:</span></dt>
718 <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
721 <dt><span class="term">Throws:</span></dt>
730 <a name="work_stealing_suspend_until_bridgehead"></a>
731 <span class="phrase"><a name="work_stealing_suspend_until"></a></span>
732 <a class="link" href="scheduling.html#work_stealing_suspend_until">Member
733 function <code class="computeroutput">suspend_until</code>()</a>
737 <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">&</span> <span class="identifier">abs_time</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
739 <div class="variablelist">
740 <p class="title"><b></b></p>
741 <dl class="variablelist">
742 <dt><span class="term">Effects:</span></dt>
744 Informs <code class="computeroutput"><span class="identifier">work_stealing</span></code>
745 that no ready fiber will be available until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>. This implementation blocks
746 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>.
748 <dt><span class="term">Throws:</span></dt>
757 <a name="work_stealing_notify_bridgehead"></a>
758 <span class="phrase"><a name="work_stealing_notify"></a></span>
759 <a class="link" href="scheduling.html#work_stealing_notify">Member
760 function <code class="computeroutput">notify</code>()</a>
764 <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>
766 <div class="variablelist">
767 <p class="title"><b></b></p>
768 <dl class="variablelist">
769 <dt><span class="term">Effects:</span></dt>
771 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>,
772 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>.
774 <dt><span class="term">Throws:</span></dt>
781 <a name="fiber.scheduling.h0"></a>
782 <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
783 Scheduler Fiber Properties</a>
786 A scheduler class directly derived from <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> can use any
787 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
788 might need to track additional properties for a fiber. For instance, a priority-based
789 scheduler would need to track a fiber’s priority.
792 <span class="bold"><strong>Boost.Fiber</strong></span> provides a mechanism by which
793 your custom scheduler can associate custom properties with each fiber.
798 <a name="class_fiber_properties_bridgehead"></a>
799 <span class="phrase"><a name="class_fiber_properties"></a></span>
800 <a class="link" href="scheduling.html#class_fiber_properties">Class
801 <code class="computeroutput">fiber_properties</code></a>
806 A custom fiber properties class must be derived from <code class="computeroutput"><span class="identifier">fiber_properties</span></code>.
808 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></span>
810 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
811 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
813 <span class="keyword">class</span> <span class="identifier">fiber_properties</span> <span class="special">{</span>
814 <span class="keyword">public</span><span class="special">:</span>
815 <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>
817 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">fiber_properties</span><span class="special">();</span>
819 <span class="keyword">protected</span><span class="special">:</span>
820 <span class="keyword">void</span> <span class="identifier">notify</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
821 <span class="special">};</span>
823 <span class="special">}}</span>
826 <a name="fiber.scheduling.h1"></a>
827 <span class="phrase"><a name="fiber.scheduling.constructor"></a></span><a class="link" href="scheduling.html#fiber.scheduling.constructor">Constructor</a>
829 <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>
831 <div class="variablelist">
832 <p class="title"><b></b></p>
833 <dl class="variablelist">
834 <dt><span class="term">Effects:</span></dt>
836 Constructs base-class component of custom subclass.
838 <dt><span class="term">Throws:</span></dt>
842 <dt><span class="term">Note:</span></dt>
844 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.
851 <a name="fiber_properties_notify_bridgehead"></a>
852 <span class="phrase"><a name="fiber_properties_notify"></a></span>
853 <a class="link" href="scheduling.html#fiber_properties_notify">Member
854 function <code class="computeroutput">notify</code>()</a>
858 <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>
860 <div class="variablelist">
861 <p class="title"><b></b></p>
862 <dl class="variablelist">
863 <dt><span class="term">Effects:</span></dt>
865 Pass control to the custom <a class="link" href="scheduling.html#class_algorithm_with_properties"><code class="computeroutput">algorithm_with_properties<></code></a> subclass’s
866 <a class="link" href="scheduling.html#algorithm_with_properties_property_change"><code class="computeroutput">algorithm_with_properties::property_change()</code></a> method.
868 <dt><span class="term">Throws:</span></dt>
872 <dt><span class="term">Note:</span></dt>
874 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
875 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
876 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>.
877 In the latter case, if application code modifies a fiber property (e.g.
878 priority) that should affect that fiber’s relationship to other ready
879 fibers, the custom scheduler must be given the opportunity to reorder
880 its ready queue. The custom property subclass should implement an access
881 method to modify such a property; that access method should call <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code>
882 once the new property value has been stored. This passes control to the
883 custom scheduler’s <code class="computeroutput"><span class="identifier">property_change</span><span class="special">()</span></code> method, allowing the custom scheduler
884 to reorder its ready queue appropriately. Use at your discretion. Of
885 course, if you define a property which does not affect the behavior of
886 the <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code>
887 method, you need not call <code class="computeroutput"><span class="identifier">notify</span><span class="special">()</span></code> when that property is modified.
894 <a name="class_algorithm_with_properties_bridgehead"></a>
895 <span class="phrase"><a name="class_algorithm_with_properties"></a></span>
896 <a class="link" href="scheduling.html#class_algorithm_with_properties">Template
897 <code class="computeroutput">algorithm_with_properties<></code></a>
902 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"><</span><span class="identifier">PROPS</span><span class="special">></span></code>.
903 <code class="computeroutput"><span class="identifier">PROPS</span></code> should be derived from
904 <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a>.
906 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></span>
908 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
909 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
910 <span class="keyword">namespace</span> <span class="identifier">algo</span> <span class="special">{</span>
912 <span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">PROPS</span> <span class="special">></span>
913 <span class="keyword">struct</span> <span class="identifier">algorithm_with_properties</span> <span class="special">{</span>
914 <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">&)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
916 <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>
918 <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>
920 <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">&)</span> <span class="keyword">noexcept</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
922 <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>
924 <span class="identifier">PROPS</span> <span class="special">&</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>
926 <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">&)</span> <span class="keyword">noexcept</span><span class="special">;</span>
928 <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>
929 <span class="special">};</span>
931 <span class="special">}}}</span>
936 <a name="algorithm_with_properties_awakened_bridgehead"></a>
937 <span class="phrase"><a name="algorithm_with_properties_awakened"></a></span>
938 <a class="link" href="scheduling.html#algorithm_with_properties_awakened">Member
939 function <code class="computeroutput">awakened</code>()</a>
943 <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">&</span> <span class="identifier">properties</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
945 <div class="variablelist">
946 <p class="title"><b></b></p>
947 <dl class="variablelist">
948 <dt><span class="term">Effects:</span></dt>
950 Informs the scheduler that fiber <code class="computeroutput"><span class="identifier">f</span></code>
951 is ready to run, like <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a>. Passes
952 the fiber’s associated <code class="computeroutput"><span class="identifier">PROPS</span></code>
955 <dt><span class="term">Throws:</span></dt>
959 <dt><span class="term">Note:</span></dt>
961 An <code class="computeroutput"><span class="identifier">algorithm_with_properties</span><span class="special"><></span></code> subclass must override this method
962 instead of <code class="computeroutput"><span class="identifier">algorithm</span><span class="special">::</span><span class="identifier">awakened</span><span class="special">()</span></code>.
969 <a name="algorithm_with_properties_pick_next_bridgehead"></a>
970 <span class="phrase"><a name="algorithm_with_properties_pick_next"></a></span>
971 <a class="link" href="scheduling.html#algorithm_with_properties_pick_next">Member
972 function <code class="computeroutput">pick_next</code>()</a>
976 <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>
978 <div class="variablelist">
979 <p class="title"><b></b></p>
980 <dl class="variablelist">
981 <dt><span class="term">Returns:</span></dt>
983 the fiber which is to be resumed next, or <code class="computeroutput"><span class="keyword">nullptr</span></code>
984 if there is no ready fiber.
986 <dt><span class="term">Throws:</span></dt>
990 <dt><span class="term">Note:</span></dt>
992 same as <a class="link" href="scheduling.html#algorithm_pick_next"><code class="computeroutput">algorithm::pick_next()</code></a>
999 <a name="algorithm_with_properties_has_ready_fibers_bridgehead"></a>
1000 <span class="phrase"><a name="algorithm_with_properties_has_ready_fibers"></a></span>
1001 <a class="link" href="scheduling.html#algorithm_with_properties_has_ready_fibers">Member
1002 function <code class="computeroutput">has_ready_fibers</code>()</a>
1006 <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>
1008 <div class="variablelist">
1009 <p class="title"><b></b></p>
1010 <dl class="variablelist">
1011 <dt><span class="term">Returns:</span></dt>
1013 <code class="computeroutput"><span class="keyword">true</span></code> if scheduler has fibers
1016 <dt><span class="term">Throws:</span></dt>
1020 <dt><span class="term">Note:</span></dt>
1022 same as <a class="link" href="scheduling.html#algorithm_has_ready_fibers"><code class="computeroutput">algorithm::has_ready_fibers()</code></a>
1029 <a name="algorithm_with_properties_suspend_until_bridgehead"></a>
1030 <span class="phrase"><a name="algorithm_with_properties_suspend_until"></a></span>
1031 <a class="link" href="scheduling.html#algorithm_with_properties_suspend_until">Member
1032 function <code class="computeroutput">suspend_until</code>()</a>
1036 <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">&</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>
1038 <div class="variablelist">
1039 <p class="title"><b></b></p>
1040 <dl class="variablelist">
1041 <dt><span class="term">Effects:</span></dt>
1043 Informs the scheduler that no fiber will be ready until time-point <code class="computeroutput"><span class="identifier">abs_time</span></code>.
1045 <dt><span class="term">Note:</span></dt>
1047 same as <a class="link" href="scheduling.html#algorithm_suspend_until"><code class="computeroutput">algorithm::suspend_until()</code></a>
1054 <a name="algorithm_with_properties_notify_bridgehead"></a>
1055 <span class="phrase"><a name="algorithm_with_properties_notify"></a></span>
1056 <a class="link" href="scheduling.html#algorithm_with_properties_notify">Member
1057 function <code class="computeroutput">notify</code>()</a>
1061 <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>
1063 <div class="variablelist">
1064 <p class="title"><b></b></p>
1065 <dl class="variablelist">
1066 <dt><span class="term">Effects:</span></dt>
1068 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>.
1070 <dt><span class="term">Note:</span></dt>
1072 same as <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a>
1079 <a name="algorithm_with_properties_properties_bridgehead"></a>
1080 <span class="phrase"><a name="algorithm_with_properties_properties"></a></span>
1081 <a class="link" href="scheduling.html#algorithm_with_properties_properties">Member
1082 function <code class="computeroutput">properties</code>()</a>
1086 <pre class="programlisting"><span class="identifier">PROPS</span><span class="special">&</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>
1088 <div class="variablelist">
1089 <p class="title"><b></b></p>
1090 <dl class="variablelist">
1091 <dt><span class="term">Returns:</span></dt>
1093 the <code class="computeroutput"><span class="identifier">PROPS</span></code> instance associated
1094 with fiber <code class="computeroutput"><span class="identifier">f</span></code>.
1096 <dt><span class="term">Throws:</span></dt>
1100 <dt><span class="term">Note:</span></dt>
1102 The fiber’s associated <code class="computeroutput"><span class="identifier">PROPS</span></code>
1103 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
1104 <a class="link" href="scheduling.html#algorithm_with_properties_property_change"><code class="computeroutput">algorithm_with_properties::property_change()</code></a>.
1105 However, every <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> subclass is expected to track
1106 a collection of ready <a class="link" href="scheduling.html#class_context"><code class="computeroutput">context</code></a> instances. This method allows
1107 your custom scheduler to retrieve the <a class="link" href="scheduling.html#class_fiber_properties"><code class="computeroutput">fiber_properties</code></a> subclass
1108 instance for any <code class="computeroutput"><span class="identifier">context</span></code>
1116 <a name="algorithm_with_properties_property_change_bridgehead"></a>
1117 <span class="phrase"><a name="algorithm_with_properties_property_change"></a></span>
1118 <a class="link" href="scheduling.html#algorithm_with_properties_property_change">Member
1119 function <code class="computeroutput">property_change</code>()</a>
1123 <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">&</span> <span class="identifier">properties</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1125 <div class="variablelist">
1126 <p class="title"><b></b></p>
1127 <dl class="variablelist">
1128 <dt><span class="term">Effects:</span></dt>
1130 Notify the custom scheduler of a possibly-relevant change to a property
1131 belonging to fiber <code class="computeroutput"><span class="identifier">f</span></code>.
1132 <code class="computeroutput"><span class="identifier">properties</span></code> contains the
1133 new values of all relevant properties.
1135 <dt><span class="term">Throws:</span></dt>
1139 <dt><span class="term">Note:</span></dt>
1141 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
1142 explicitly calls <a class="link" href="scheduling.html#fiber_properties_notify"><code class="computeroutput">fiber_properties::notify()</code></a>.
1149 <a name="algorithm_with_properties_new_properties_bridgehead"></a>
1150 <span class="phrase"><a name="algorithm_with_properties_new_properties"></a></span>
1151 <a class="link" href="scheduling.html#algorithm_with_properties_new_properties">Member
1152 function <code class="computeroutput">new_properties</code>()</a>
1156 <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>
1158 <div class="variablelist">
1159 <p class="title"><b></b></p>
1160 <dl class="variablelist">
1161 <dt><span class="term">Returns:</span></dt>
1163 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>.
1165 <dt><span class="term">Note:</span></dt>
1167 By default, <code class="computeroutput"><span class="identifier">algorithm_with_properties</span><span class="special"><>::</span><span class="identifier">new_properties</span><span class="special">()</span></code> simply returns <code class="computeroutput"><span class="keyword">new</span>
1168 <span class="identifier">PROPS</span><span class="special">(</span><span class="identifier">f</span><span class="special">)</span></code>,
1169 placing the <code class="computeroutput"><span class="identifier">PROPS</span></code> instance
1170 on the heap. Override this method to allocate <code class="computeroutput"><span class="identifier">PROPS</span></code>
1171 some other way. The returned <code class="computeroutput"><span class="identifier">fiber_properties</span></code>
1172 pointer must point to the <code class="computeroutput"><span class="identifier">PROPS</span></code>
1173 instance to be associated with fiber <code class="computeroutput"><span class="identifier">f</span></code>.
1178 <a name="context"></a></p>
1180 <a name="class_context_bridgehead"></a>
1181 <span class="phrase"><a name="class_context"></a></span>
1182 <a class="link" href="scheduling.html#class_context">Class
1183 <code class="computeroutput">context</code></a>
1188 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
1189 scheduler implementation.
1192 <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
1193 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>
1194 <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>.
1195 This hook is reserved for use by <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementations. (For
1196 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>
1197 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>,
1198 <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>.
1201 Your <code class="computeroutput"><span class="identifier">algorithm</span></code> implementation
1202 may use any container you desire to manage passed <code class="computeroutput"><span class="identifier">context</span></code>
1203 instances. <code class="computeroutput"><span class="identifier">ready_queue_t</span></code> avoids
1204 some of the overhead of typical STL containers.
1206 <pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</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">></span>
1208 <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span>
1209 <span class="keyword">namespace</span> <span class="identifier">fibers</span> <span class="special">{</span>
1211 <span class="keyword">enum</span> <span class="keyword">class</span> <span class="identifier">type</span> <span class="special">{</span>
1212 <span class="identifier">none</span> <span class="special">=</span> <span class="emphasis"><em>unspecified</em></span><span class="special">,</span>
1213 <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>
1214 <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>
1215 <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>
1216 <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>
1217 <span class="special">};</span>
1219 <span class="keyword">class</span> <span class="identifier">context</span> <span class="special">{</span>
1220 <span class="keyword">public</span><span class="special">:</span>
1221 <span class="keyword">class</span> <span class="identifier">id</span><span class="special">;</span>
1223 <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>
1225 <span class="identifier">context</span><span class="special">(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
1226 <span class="identifier">context</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&)</span> <span class="special">=</span> <span class="keyword">delete</span><span class="special">;</span>
1228 <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>
1230 <span class="keyword">void</span> <span class="identifier">detach</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1231 <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>
1233 <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>
1235 <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>
1237 <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>
1238 <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>
1239 <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>
1241 <span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">></span>
1242 <span class="keyword">void</span> <span class="identifier">ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1243 <span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">></span>
1244 <span class="keyword">void</span> <span class="identifier">remote_ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1245 <span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">></span>
1246 <span class="keyword">void</span> <span class="identifier">wait_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1248 <span class="keyword">void</span> <span class="identifier">ready_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1249 <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>
1250 <span class="keyword">void</span> <span class="identifier">wait_unlink</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1252 <span class="keyword">void</span> <span class="identifier">suspend</span><span class="special">()</span> <span class="keyword">noexcept</span><span class="special">;</span>
1253 <span class="keyword">void</span> <span class="identifier">set_ready</span><span class="special">(</span> <span class="identifier">context</span> <span class="special">*)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1254 <span class="special">};</span>
1256 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">r</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1258 <span class="special">}}</span>
1263 <a name="context_active_bridgehead"></a>
1264 <span class="phrase"><a name="context_active"></a></span>
1265 <a class="link" href="scheduling.html#context_active">Static member function
1266 <code class="computeroutput">active</code>()</a>
1270 <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>
1272 <div class="variablelist">
1273 <p class="title"><b></b></p>
1274 <dl class="variablelist">
1275 <dt><span class="term">Returns:</span></dt>
1277 Pointer to instance of current fiber.
1279 <dt><span class="term">Throws:</span></dt>
1288 <a name="context_get_id_bridgehead"></a>
1289 <span class="phrase"><a name="context_get_id"></a></span>
1290 <a class="link" href="scheduling.html#context_get_id">Member function <code class="computeroutput">get_id</code>()</a>
1294 <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>
1296 <div class="variablelist">
1297 <p class="title"><b></b></p>
1298 <dl class="variablelist">
1299 <dt><span class="term">Returns:</span></dt>
1301 If <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1302 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
1303 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>.
1305 <dt><span class="term">Throws:</span></dt>
1309 <dt><span class="term">See also:</span></dt>
1311 <a class="link" href="fiber_mgmt/fiber.html#fiber_get_id"><code class="computeroutput">fiber::get_id()</code></a>
1318 <a name="context_attach_bridgehead"></a>
1319 <span class="phrase"><a name="context_attach"></a></span>
1320 <a class="link" href="scheduling.html#context_attach">Member function <code class="computeroutput">attach</code>()</a>
1324 <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>
1326 <div class="variablelist">
1327 <p class="title"><b></b></p>
1328 <dl class="variablelist">
1329 <dt><span class="term">Precondition:</span></dt>
1331 <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_scheduler</span><span class="special">()</span>
1332 <span class="special">==</span> <span class="keyword">nullptr</span></code>
1334 <dt><span class="term">Effects:</span></dt>
1336 Attach fiber <code class="computeroutput"><span class="identifier">f</span></code> to scheduler
1337 running <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1339 <dt><span class="term">Postcondition:</span></dt>
1341 <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_scheduler</span><span class="special">()</span>
1342 <span class="special">!=</span> <span class="keyword">nullptr</span></code>
1344 <dt><span class="term">Throws:</span></dt>
1348 <dt><span class="term">Note:</span></dt>
1350 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">()-></span><span class="identifier">attach</span><span class="special">(</span><span class="identifier">f</span><span class="special">);</span></code>
1352 <dt><span class="term">Note:</span></dt>
1354 <code class="computeroutput"><span class="identifier">f</span></code> must not be the running
1355 fiber’s context. It must not be <a class="link" href="overview.html#blocking"><span class="emphasis"><em>blocked</em></span></a>
1356 or terminated. It must not be a <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1357 It must be currently detached. It must not currently be linked into an
1358 <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementation’s ready queue. Most of these conditions
1359 are implied by <code class="computeroutput"><span class="identifier">f</span></code> being
1360 owned by an <code class="computeroutput"><span class="identifier">algorithm</span></code>
1361 implementation: that is, it has been passed to <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a> but
1362 has not yet been returned by <a class="link" href="scheduling.html#algorithm_pick_next"><code class="computeroutput">algorithm::pick_next()</code></a>.
1363 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>
1364 with the <code class="computeroutput"><span class="identifier">context</span><span class="special">*</span></code>
1365 it is about to return. It must first remove <code class="computeroutput"><span class="identifier">f</span></code>
1366 from its ready queue. You should never pass a <code class="computeroutput"><span class="identifier">pinned_context</span></code>
1367 to <code class="computeroutput"><span class="identifier">attach</span><span class="special">()</span></code>
1368 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.
1375 <a name="context_detach_bridgehead"></a>
1376 <span class="phrase"><a name="context_detach"></a></span>
1377 <a class="link" href="scheduling.html#context_detach">Member function <code class="computeroutput">detach</code>()</a>
1381 <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>
1383 <div class="variablelist">
1384 <p class="title"><b></b></p>
1385 <dl class="variablelist">
1386 <dt><span class="term">Precondition:</span></dt>
1388 <code class="computeroutput"><span class="special">(</span><span class="keyword">this</span><span class="special">-></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">&&</span> <span class="special">!</span>
1389 <span class="keyword">this</span><span class="special">-></span><span class="identifier">is_context</span><span class="special">(</span><span class="identifier">pinned_context</span><span class="special">)</span></code>
1391 <dt><span class="term">Effects:</span></dt>
1393 Detach fiber <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1394 from its scheduler running <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1396 <dt><span class="term">Throws:</span></dt>
1400 <dt><span class="term">Postcondition:</span></dt>
1402 <code class="computeroutput"><span class="keyword">this</span><span class="special">-></span><span class="identifier">get_scheduler</span><span class="special">()</span>
1403 <span class="special">==</span> <span class="keyword">nullptr</span></code>
1405 <dt><span class="term">Note:</span></dt>
1407 This method must be called on the thread with which the fiber is currently
1408 associated. <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1409 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>
1410 or terminated. It must not be a <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1411 It must not be detached already. It must not already be linked into an
1412 <a class="link" href="scheduling.html#class_algorithm"><code class="computeroutput">algorithm</code></a> implementation’s ready queue. Most of these conditions
1413 are implied by <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1414 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>
1415 implementation must, however, test for <code class="computeroutput"><span class="identifier">pinned_context</span></code>.
1416 It must call <code class="computeroutput"><span class="identifier">detach</span><span class="special">()</span></code>
1417 <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.
1419 <dt><span class="term">Note:</span></dt>
1421 In particular, it is erroneous to attempt to migrate a fiber from one
1422 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.
1423 <code class="computeroutput"><span class="identifier">pick_next</span><span class="special">()</span></code>
1424 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
1425 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>
1428 <dt><span class="term">Note:</span></dt>
1430 Unless you intend make a fiber available for potential migration to a
1431 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>.
1438 <a name="context_is_context_bridgehead"></a>
1439 <span class="phrase"><a name="context_is_context"></a></span>
1440 <a class="link" href="scheduling.html#context_is_context">Member function
1441 <code class="computeroutput">is_context</code>()</a>
1445 <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>
1447 <div class="variablelist">
1448 <p class="title"><b></b></p>
1449 <dl class="variablelist">
1450 <dt><span class="term">Returns:</span></dt>
1452 <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.
1454 <dt><span class="term">Throws:</span></dt>
1458 <dt><span class="term">Note:</span></dt>
1460 <code class="computeroutput"><span class="identifier">type</span><span class="special">::</span><span class="identifier">worker_context</span></code> here means any fiber
1461 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>
1462 the <code class="computeroutput"><span class="identifier">context</span></code> is associated
1463 with the <span class="quote">“<span class="quote">main</span>”</span> fiber of the thread: the one implicitly
1464 created by the thread itself, rather than one explicitly created by
1465 <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>
1466 the <code class="computeroutput"><span class="identifier">context</span></code> is associated
1467 with a <span class="quote">“<span class="quote">dispatching</span>”</span> fiber, responsible for dispatching
1468 awakened fibers to a scheduler’s ready-queue. The <span class="quote">“<span class="quote">dispatching</span>”</span>
1469 fiber is an implementation detail of the fiber manager. The context of
1470 the <span class="quote">“<span class="quote">main</span>”</span> or <span class="quote">“<span class="quote">dispatching</span>”</span> fiber — any fiber
1471 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>
1472 — must never be passed to <a class="link" href="scheduling.html#context_detach"><code class="computeroutput">context::detach()</code></a>.
1479 <a name="context_is_terminated_bridgehead"></a>
1480 <span class="phrase"><a name="context_is_terminated"></a></span>
1481 <a class="link" href="scheduling.html#context_is_terminated">Member
1482 function <code class="computeroutput">is_terminated</code>()</a>
1486 <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>
1488 <div class="variablelist">
1489 <p class="title"><b></b></p>
1490 <dl class="variablelist">
1491 <dt><span class="term">Returns:</span></dt>
1493 <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.
1495 <dt><span class="term">Throws:</span></dt>
1499 <dt><span class="term">Note:</span></dt>
1501 The <code class="computeroutput"><span class="identifier">context</span></code> has returned
1502 from its fiber-function and is no longer considered a valid context.
1509 <a name="context_ready_is_linked_bridgehead"></a>
1510 <span class="phrase"><a name="context_ready_is_linked"></a></span>
1511 <a class="link" href="scheduling.html#context_ready_is_linked">Member
1512 function <code class="computeroutput">ready_is_linked</code>()</a>
1516 <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>
1518 <div class="variablelist">
1519 <p class="title"><b></b></p>
1520 <dl class="variablelist">
1521 <dt><span class="term">Returns:</span></dt>
1523 <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>
1524 implementation’s
1527 <dt><span class="term">Throws:</span></dt>
1531 <dt><span class="term">Note:</span></dt>
1533 Specifically, this method indicates whether <a class="link" href="scheduling.html#context_ready_link"><code class="computeroutput">context::ready_link()</code></a> has
1534 been called on <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>.
1535 <code class="computeroutput"><span class="identifier">ready_is_linked</span><span class="special">()</span></code>
1536 has no information about participation in any other containers.
1543 <a name="context_remote_ready_is_linked_bridgehead"></a>
1544 <span class="phrase"><a name="context_remote_ready_is_linked"></a></span>
1545 <a class="link" href="scheduling.html#context_remote_ready_is_linked">Member
1546 function <code class="computeroutput">remote_ready_is_linked</code>()</a>
1550 <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>
1552 <div class="variablelist">
1553 <p class="title"><b></b></p>
1554 <dl class="variablelist">
1555 <dt><span class="term">Returns:</span></dt>
1557 <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.
1559 <dt><span class="term">Throws:</span></dt>
1563 <dt><span class="term">Note:</span></dt>
1565 A <code class="computeroutput"><span class="identifier">context</span></code> signaled as
1566 ready by another thread is first stored in the fiber manager’s remote-ready-queue.
1567 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
1568 from cross-thread <a class="link" href="scheduling.html#algorithm_awakened"><code class="computeroutput">algorithm::awakened()</code></a> calls.
1575 <a name="context_wait_is_linked_bridgehead"></a>
1576 <span class="phrase"><a name="context_wait_is_linked"></a></span>
1577 <a class="link" href="scheduling.html#context_wait_is_linked">Member
1578 function <code class="computeroutput">wait_is_linked</code>()</a>
1582 <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>
1584 <div class="variablelist">
1585 <p class="title"><b></b></p>
1586 <dl class="variablelist">
1587 <dt><span class="term">Returns:</span></dt>
1589 <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
1590 synchronization object.
1592 <dt><span class="term">Throws:</span></dt>
1596 <dt><span class="term">Note:</span></dt>
1598 The <code class="computeroutput"><span class="identifier">context</span></code> of a fiber
1599 waiting on a synchronization object (e.g. <code class="computeroutput"><span class="identifier">mutex</span></code>,
1600 <code class="computeroutput"><span class="identifier">condition_variable</span></code> etc.)
1601 is stored in the wait-queue of that synchronization object.
1608 <a name="context_ready_link_bridgehead"></a>
1609 <span class="phrase"><a name="context_ready_link"></a></span>
1610 <a class="link" href="scheduling.html#context_ready_link">Member function
1611 <code class="computeroutput">ready_link</code>()</a>
1615 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">></span>
1616 <span class="keyword">void</span> <span class="identifier">ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&</span> <span class="identifier">lst</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1618 <div class="variablelist">
1619 <p class="title"><b></b></p>
1620 <dl class="variablelist">
1621 <dt><span class="term">Effects:</span></dt>
1623 Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1624 in ready-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1626 <dt><span class="term">Throws:</span></dt>
1630 <dt><span class="term">Note:</span></dt>
1632 Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1633 a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>,
1634 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>.
1635 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.
1642 <a name="context_remote_ready_link_bridgehead"></a>
1643 <span class="phrase"><a name="context_remote_ready_link"></a></span>
1644 <a class="link" href="scheduling.html#context_remote_ready_link">Member
1645 function <code class="computeroutput">remote_ready_link</code>()</a>
1649 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">></span>
1650 <span class="keyword">void</span> <span class="identifier">remote_ready_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&</span> <span class="identifier">lst</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1652 <div class="variablelist">
1653 <p class="title"><b></b></p>
1654 <dl class="variablelist">
1655 <dt><span class="term">Effects:</span></dt>
1657 Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1658 in remote-ready-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1660 <dt><span class="term">Throws:</span></dt>
1664 <dt><span class="term">Note:</span></dt>
1666 Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1667 a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>.
1674 <a name="context_wait_link_bridgehead"></a>
1675 <span class="phrase"><a name="context_wait_link"></a></span>
1676 <a class="link" href="scheduling.html#context_wait_link">Member function
1677 <code class="computeroutput">wait_link</code>()</a>
1681 <pre class="programlisting"><span class="keyword">template</span><span class="special"><</span> <span class="keyword">typename</span> <span class="identifier">List</span> <span class="special">></span>
1682 <span class="keyword">void</span> <span class="identifier">wait_link</span><span class="special">(</span> <span class="identifier">List</span> <span class="special">&</span> <span class="identifier">lst</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1684 <div class="variablelist">
1685 <p class="title"><b></b></p>
1686 <dl class="variablelist">
1687 <dt><span class="term">Effects:</span></dt>
1689 Stores <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1690 in wait-queue <code class="computeroutput"><span class="identifier">lst</span></code>.
1692 <dt><span class="term">Throws:</span></dt>
1696 <dt><span class="term">Note:</span></dt>
1698 Argument <code class="computeroutput"><span class="identifier">lst</span></code> must be
1699 a doubly-linked list from <a href="http://www.boost.org/doc/libs/release/libs/intrusive/index.html" target="_top">Boost.Intrusive</a>.
1706 <a name="context_ready_unlink_bridgehead"></a>
1707 <span class="phrase"><a name="context_ready_unlink"></a></span>
1708 <a class="link" href="scheduling.html#context_ready_unlink">Member
1709 function <code class="computeroutput">ready_unlink</code>()</a>
1713 <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>
1715 <div class="variablelist">
1716 <p class="title"><b></b></p>
1717 <dl class="variablelist">
1718 <dt><span class="term">Effects:</span></dt>
1720 Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1721 from ready-queue: undoes the effect of <a class="link" href="scheduling.html#context_ready_link"><code class="computeroutput">context::ready_link()</code></a>.
1723 <dt><span class="term">Throws:</span></dt>
1732 <a name="context_remote_ready_unlink_bridgehead"></a>
1733 <span class="phrase"><a name="context_remote_ready_unlink"></a></span>
1734 <a class="link" href="scheduling.html#context_remote_ready_unlink">Member
1735 function <code class="computeroutput">remote_ready_unlink</code>()</a>
1739 <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>
1741 <div class="variablelist">
1742 <p class="title"><b></b></p>
1743 <dl class="variablelist">
1744 <dt><span class="term">Effects:</span></dt>
1746 Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1747 from remote-ready-queue.
1749 <dt><span class="term">Throws:</span></dt>
1758 <a name="context_wait_unlink_bridgehead"></a>
1759 <span class="phrase"><a name="context_wait_unlink"></a></span>
1760 <a class="link" href="scheduling.html#context_wait_unlink">Member
1761 function <code class="computeroutput">wait_unlink</code>()</a>
1765 <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>
1767 <div class="variablelist">
1768 <p class="title"><b></b></p>
1769 <dl class="variablelist">
1770 <dt><span class="term">Effects:</span></dt>
1772 Removes <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1775 <dt><span class="term">Throws:</span></dt>
1784 <a name="context_suspend_bridgehead"></a>
1785 <span class="phrase"><a name="context_suspend"></a></span>
1786 <a class="link" href="scheduling.html#context_suspend">Member function <code class="computeroutput">suspend</code>()</a>
1790 <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>
1792 <div class="variablelist">
1793 <p class="title"><b></b></p>
1794 <dl class="variablelist">
1795 <dt><span class="term">Effects:</span></dt>
1797 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_set_ready"><code class="computeroutput">context::set_ready()</code></a>.
1798 <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code>
1799 is marked as not-ready, and control passes to the scheduler to select
1800 another fiber to run.
1802 <dt><span class="term">Throws:</span></dt>
1806 <dt><span class="term">Note:</span></dt>
1808 This is a low-level API potentially useful for integration with other
1809 frameworks. It is not intended to be directly invoked by a typical application
1812 <dt><span class="term">Note:</span></dt>
1814 The burden is on the caller to arrange for a call to <code class="computeroutput"><span class="identifier">set_ready</span><span class="special">()</span></code> with a pointer to <code class="computeroutput"><span class="keyword">this</span></code>
1815 at some future time.
1822 <a name="context_set_ready_bridgehead"></a>
1823 <span class="phrase"><a name="context_set_ready"></a></span>
1824 <a class="link" href="scheduling.html#context_set_ready">Member function
1825 <code class="computeroutput">set_ready</code>()</a>
1829 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">set_ready</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>
1831 <div class="variablelist">
1832 <p class="title"><b></b></p>
1833 <dl class="variablelist">
1834 <dt><span class="term">Effects:</span></dt>
1836 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
1837 not immediately resume that fiber; rather it passes the fiber to the
1838 scheduler for subsequent resumption. If the scheduler is idle (has not
1839 returned from a call to <a class="link" href="scheduling.html#algorithm_suspend_until"><code class="computeroutput">algorithm::suspend_until()</code></a>),
1840 <a class="link" href="scheduling.html#algorithm_notify"><code class="computeroutput">algorithm::notify()</code></a> is called to wake it up.
1842 <dt><span class="term">Throws:</span></dt>
1846 <dt><span class="term">Note:</span></dt>
1848 This is a low-level API potentially useful for integration with other
1849 frameworks. It is not intended to be directly invoked by a typical application
1852 <dt><span class="term">Note:</span></dt>
1854 It is explicitly supported to call <code class="computeroutput"><span class="identifier">set_ready</span><span class="special">(</span><span class="identifier">ctx</span><span class="special">)</span></code> from a thread other than the one on
1855 which <code class="computeroutput"><span class="special">*</span><span class="identifier">ctx</span></code>
1856 is currently suspended. The corresponding fiber will be resumed on its
1857 original thread in due course.
1864 <a name="context_less_bridgehead"></a>
1865 <span class="phrase"><a name="context_less"></a></span>
1866 <a class="link" href="scheduling.html#context_less">Non-member function <code class="computeroutput">operator<()</code></a>
1870 <pre class="programlisting"><span class="keyword">bool</span> <span class="keyword">operator</span><span class="special"><(</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">l</span><span class="special">,</span> <span class="identifier">context</span> <span class="keyword">const</span><span class="special">&</span> <span class="identifier">r</span><span class="special">)</span> <span class="keyword">noexcept</span><span class="special">;</span>
1872 <div class="variablelist">
1873 <p class="title"><b></b></p>
1874 <dl class="variablelist">
1875 <dt><span class="term">Returns:</span></dt>
1877 <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"><</span> <span class="identifier">r</span><span class="special">.</span><span class="identifier">get_id</span><span class="special">()</span></code>
1878 is <code class="computeroutput"><span class="keyword">true</span></code>, <code class="computeroutput"><span class="keyword">false</span></code>
1881 <dt><span class="term">Throws:</span></dt>
1888 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
1889 <td align="left"></td>
1890 <td align="right"><div class="copyright-footer">Copyright © 2013 Oliver Kowalke<p>
1891 Distributed under the Boost Software License, Version 1.0. (See accompanying
1892 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>)
1897 <div class="spirit-nav">
1898 <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>