3 <meta http-equiv=
"Content-Type" content=
"text/html; charset=US-ASCII">
4 <title>Embedded Main Loop
</title>
5 <link rel=
"stylesheet" href=
"../../../../../../doc/src/boostbook.css" type=
"text/css">
6 <meta name=
"generator" content=
"DocBook XSL Stylesheets V1.75.2">
7 <link rel=
"home" href=
"../../index.html" title=
"Chapter 1. Fiber">
8 <link rel=
"up" href=
"../integration.html" title=
"Sharing a Thread with Another Main Loop">
9 <link rel=
"prev" href=
"event_driven_program.html" title=
"Event-Driven Program">
10 <link rel=
"next" href=
"deeper_dive_into___boost_asio__.html" title=
"Deeper Dive into Boost.Asio">
12 <body bgcolor=
"white" text=
"black" link=
"#0000FF" vlink=
"#840084" alink=
"#0000FF">
13 <table cellpadding=
"2" width=
"100%"><tr>
14 <td valign=
"top"><img alt=
"Boost C++ Libraries" width=
"277" height=
"86" src=
"../../../../../../boost.png"></td>
15 <td align=
"center"><a href=
"../../../../../../index.html">Home
</a></td>
16 <td align=
"center"><a href=
"../../../../../../libs/libraries.htm">Libraries
</a></td>
17 <td align=
"center"><a href=
"http://www.boost.org/users/people.html">People
</a></td>
18 <td align=
"center"><a href=
"http://www.boost.org/users/faq.html">FAQ
</a></td>
19 <td align=
"center"><a href=
"../../../../../../more/index.htm">More
</a></td>
22 <div class=
"spirit-nav">
23 <a accesskey=
"p" href=
"event_driven_program.html"><img src=
"../../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../integration.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=
"deeper_dive_into___boost_asio__.html"><img src=
"../../../../../../doc/src/images/next.png" alt=
"Next"></a>
26 <div class=
"titlepage"><div><div><h3 class=
"title">
27 <a name=
"fiber.integration.embedded_main_loop"></a><a name=
"embedded_main_loop"></a><a class=
"link" href=
"embedded_main_loop.html" title=
"Embedded Main Loop">Embedded
29 </h3></div></div></div>
31 More challenging is when the application
’s main loop is embedded in some other
32 library or framework. Such an application will typically, after performing
33 all necessary setup, pass control to some form of
<code class=
"computeroutput"><span class=
"identifier">run
</span><span class=
"special">()
</span></code> function from which control does not return
34 until application shutdown.
37 A
<a href=
"http://www.boost.org/doc/libs/release/libs/asio/index.html" target=
"_top">Boost.Asio
</a>
38 program might call
<a href=
"http://www.boost.org/doc/libs/release/doc/html/boost_asio/reference/io_service/run.html" target=
"_top"><code class=
"computeroutput"><span class=
"identifier">io_service
</span><span class=
"special">::
</span><span class=
"identifier">run
</span><span class=
"special">()
</span></code></a>
42 In general, the trick is to arrange to pass control to
<a class=
"link" href=
"../fiber_mgmt/this_fiber.html#this_fiber_yield"><code class=
"computeroutput">this_fiber::yield()
</code></a> frequently.
43 You could use an
<a href=
"http://www.boost.org/doc/libs/release/doc/html/boost_asio/reference/high_resolution_timer.html" target=
"_top">Asio
44 timer
</a> for that purpose. You could instantiate the timer, arranging
45 to call a handler function when the timer expires. The handler function could
46 call
<code class=
"computeroutput"><span class=
"identifier">yield
</span><span class=
"special">()
</span></code>,
47 then reset the timer and arrange to wake up again on its next expiration.
50 Since, in this thought experiment, we always pass control to the fiber manager
51 via
<code class=
"computeroutput"><span class=
"identifier">yield
</span><span class=
"special">()
</span></code>,
52 the calling fiber is never blocked. Therefore there is always at least one
53 ready fiber. Therefore the fiber manager never calls
<a class=
"link" href=
"../scheduling.html#algorithm_suspend_until"><code class=
"computeroutput">algorithm::suspend_until()
</code></a>.
56 Using
<a href=
"http://www.boost.org/doc/libs/release/doc/html/boost_asio/reference/io_service/post.html" target=
"_top"><code class=
"computeroutput"><span class=
"identifier">io_service
</span><span class=
"special">::
</span><span class=
"identifier">post
</span><span class=
"special">()
</span></code></a>
57 instead of setting a timer for some nonzero interval would be unfriendly
58 to other threads. When all I/O is pending and all fibers are blocked, the
59 io_service and the fiber manager would simply spin the CPU, passing control
60 back and forth to each other. Using a timer allows tuning the responsiveness
61 of this thread relative to others.
64 <table xmlns:
rev=
"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width=
"100%"><tr>
65 <td align=
"left"></td>
66 <td align=
"right"><div class=
"copyright-footer">Copyright
© 2013 Oliver Kowalke
<p>
67 Distributed under the Boost Software License, Version
1.0. (See accompanying
68 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>)
73 <div class=
"spirit-nav">
74 <a accesskey=
"p" href=
"event_driven_program.html"><img src=
"../../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../integration.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=
"deeper_dive_into___boost_asio__.html"><img src=
"../../../../../../doc/src/images/next.png" alt=
"Next"></a>