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