3 <meta http-equiv=
"Content-Type" content=
"text/html; charset=US-ASCII">
4 <title>when_all, return values
</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=
"../when_all_functionality.html" title=
"when_all functionality">
9 <link rel=
"prev" href=
"when_all__simple_completion.html" title=
"when_all, simple completion">
10 <link rel=
"next" href=
"when_all_until_first_exception.html" title=
"when_all until first exception">
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=
"when_all__simple_completion.html"><img src=
"../../../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../when_all_functionality.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=
"when_all_until_first_exception.html"><img src=
"../../../../../../../doc/src/images/next.png" alt=
"Next"></a>
26 <div class=
"titlepage"><div><div><h4 class=
"title">
27 <a name=
"fiber.when_any.when_all_functionality.when_all__return_values"></a><a class=
"link" href=
"when_all__return_values.html" title=
"when_all, return values">when_all,
29 </h4></div></div></div>
31 As soon as we want to collect return values from all the task functions,
32 we can see right away how to reuse
<a class=
"link" href=
"../when_any/when_any__return_value.html#wait_first_value"><code class=
"computeroutput"><span class=
"identifier">wait_first_value
</span><span class=
"special">()
</span></code></a>'s
33 channel
<T
> for the purpose. All we have to do is avoid closing it
34 after the first value!
37 But in fact, collecting multiple values raises an interesting question:
38 do we
<span class=
"emphasis"><em>really
</em></span> want to wait until the slowest of them
39 has arrived? Wouldn't we rather process each result as soon as it becomes
43 Fortunately we can present both APIs. Let's define
<code class=
"computeroutput"><span class=
"identifier">wait_all_values_source
</span><span class=
"special">()
</span></code> to return
<code class=
"computeroutput"><span class=
"identifier">shared_ptr
</span><span class=
"special"><</span><span class=
"identifier">unbounded_channel
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>></span></code>.
<sup>[
<a name=
"fiber.when_any.when_all_functionality.when_all__return_values.f0" href=
"#ftn.fiber.when_any.when_all_functionality.when_all__return_values.f0" class=
"footnote">6</a>]
</sup>
46 <a name=
"wait_all_values"></a>Given
<code class=
"computeroutput"><span class=
"identifier">wait_all_values_source
</span><span class=
"special">()
</span></code>, it's straightforward to implement
<code class=
"computeroutput"><span class=
"identifier">wait_all_values
</span><span class=
"special">()
</span></code>:
50 <pre class=
"programlisting"><span class=
"keyword">template
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">Fn
</span><span class=
"special">,
</span> <span class=
"keyword">typename
</span> <span class=
"special">...
</span> <span class=
"identifier">Fns
</span> <span class=
"special">></span>
51 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">vector
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">result_of
</span><span class=
"special"><</span> <span class=
"identifier">Fn
</span><span class=
"special">()
</span> <span class=
"special">>::
</span><span class=
"identifier">type
</span> <span class=
"special">></span>
52 <span class=
"identifier">wait_all_values
</span><span class=
"special">(
</span> <span class=
"identifier">Fn
</span> <span class=
"special">&&</span> <span class=
"identifier">function
</span><span class=
"special">,
</span> <span class=
"identifier">Fns
</span> <span class=
"special">&&</span> <span class=
"special">...
</span> <span class=
"identifier">functions
</span><span class=
"special">)
</span> <span class=
"special">{
</span>
53 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">size_t
</span> <span class=
"identifier">count
</span><span class=
"special">(
</span> <span class=
"number">1</span> <span class=
"special">+
</span> <span class=
"keyword">sizeof
</span> <span class=
"special">...
</span> <span class=
"special">(
</span> <span class=
"identifier">functions
</span><span class=
"special">)
</span> <span class=
"special">);
</span>
54 <span class=
"keyword">typedef
</span> <span class=
"keyword">typename
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">result_of
</span><span class=
"special"><</span> <span class=
"identifier">Fn
</span><span class=
"special">()
</span> <span class=
"special">>::
</span><span class=
"identifier">type
</span> <span class=
"identifier">return_t
</span><span class=
"special">;
</span>
55 <span class=
"keyword">typedef
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">vector
</span><span class=
"special"><</span> <span class=
"identifier">return_t
</span> <span class=
"special">></span> <span class=
"identifier">vector_t
</span><span class=
"special">;
</span>
56 <span class=
"identifier">vector_t
</span> <span class=
"identifier">results
</span><span class=
"special">;
</span>
57 <span class=
"identifier">results
</span><span class=
"special">.
</span><span class=
"identifier">reserve
</span><span class=
"special">(
</span> <span class=
"identifier">count
</span><span class=
"special">);
</span>
59 <span class=
"comment">// get channel
</span>
60 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">shared_ptr
</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">unbounded_channel
</span><span class=
"special"><</span> <span class=
"identifier">return_t
</span> <span class=
"special">></span> <span class=
"special">></span> <span class=
"identifier">channel
</span> <span class=
"special">=
</span>
61 <span class=
"identifier">wait_all_values_source
</span><span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">forward
</span><span class=
"special"><</span> <span class=
"identifier">Fn
</span> <span class=
"special">>(
</span> <span class=
"identifier">function
</span><span class=
"special">),
</span>
62 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">forward
</span><span class=
"special"><</span> <span class=
"identifier">Fns
</span> <span class=
"special">>(
</span> <span class=
"identifier">functions
</span><span class=
"special">)
</span> <span class=
"special">...
</span> <span class=
"special">);
</span>
63 <span class=
"comment">// fill results vector
</span>
64 <span class=
"identifier">return_t
</span> <span class=
"identifier">value
</span><span class=
"special">;
</span>
65 <span class=
"keyword">while
</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">channel_op_status
</span><span class=
"special">::
</span><span class=
"identifier">success
</span> <span class=
"special">==
</span> <span class=
"identifier">channel
</span><span class=
"special">-
></span><span class=
"identifier">pop
</span><span class=
"special">(
</span><span class=
"identifier">value
</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">{
</span>
66 <span class=
"identifier">results
</span><span class=
"special">.
</span><span class=
"identifier">push_back
</span><span class=
"special">(
</span> <span class=
"identifier">value
</span><span class=
"special">);
</span>
67 <span class=
"special">}
</span>
68 <span class=
"comment">// return vector to caller
</span>
69 <span class=
"keyword">return
</span> <span class=
"identifier">results
</span><span class=
"special">;
</span>
70 <span class=
"special">}
</span>
75 It might be called like this:
79 <pre class=
"programlisting"><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">string
</span> <span class=
"special">></span> <span class=
"identifier">values
</span> <span class=
"special">=
</span>
80 <span class=
"identifier">wait_all_values
</span><span class=
"special">(
</span>
81 <span class=
"special">[](){
</span> <span class=
"keyword">return
</span> <span class=
"identifier">sleeper
</span><span class=
"special">(
</span><span class=
"string">"wav_late"</span><span class=
"special">,
</span> <span class=
"number">150</span><span class=
"special">);
</span> <span class=
"special">},
</span>
82 <span class=
"special">[](){
</span> <span class=
"keyword">return
</span> <span class=
"identifier">sleeper
</span><span class=
"special">(
</span><span class=
"string">"wav_middle"</span><span class=
"special">,
</span> <span class=
"number">100</span><span class=
"special">);
</span> <span class=
"special">},
</span>
83 <span class=
"special">[](){
</span> <span class=
"keyword">return
</span> <span class=
"identifier">sleeper
</span><span class=
"special">(
</span><span class=
"string">"wav_early"</span><span class=
"special">,
</span> <span class=
"number">50</span><span class=
"special">);
</span> <span class=
"special">});
</span>
88 As you can see from the loop in
<code class=
"computeroutput"><span class=
"identifier">wait_all_values
</span><span class=
"special">()
</span></code>, instead of requiring its caller to count
89 values, we define
<code class=
"computeroutput"><span class=
"identifier">wait_all_values_source
</span><span class=
"special">()
</span></code> to
<a class=
"link" href=
"../../synchronization/channels.html#unbounded_channel_close"><code class=
"computeroutput">unbounded_channel::close()
</code></a> the
90 channel when done. But how do we do that? Each producer fiber is independent.
91 It has no idea whether it is the last one to
<a class=
"link" href=
"../../synchronization/channels.html#unbounded_channel_push"><code class=
"computeroutput">unbounded_channel::push()
</code></a> a
95 <a name=
"wait_nchannel"></a>We can address that problem with a counting
96 fa
çade for the
<code class=
"computeroutput"><span class=
"identifier">unbounded_channel
</span><span class=
"special"><></span></code>. In fact, our fa
çade need only
97 support the producer end of the channel.
101 <pre class=
"programlisting"><span class=
"comment">// Introduce a channel facade that closes the channel once a specific number
</span>
102 <span class=
"comment">// of items has been pushed. This allows an arbitrary consumer to read until
</span>
103 <span class=
"comment">// 'closed' without itself having to count items.
</span>
104 <span class=
"keyword">template
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">T
</span> <span class=
"special">></span>
105 <span class=
"keyword">class
</span> <span class=
"identifier">nchannel
</span> <span class=
"special">{
</span>
106 <span class=
"keyword">public
</span><span class=
"special">:
</span>
107 <span class=
"identifier">nchannel
</span><span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">shared_ptr
</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">unbounded_channel
</span><span class=
"special"><</span> <span class=
"identifier">T
</span> <span class=
"special">></span> <span class=
"special">></span> <span class=
"identifier">cp
</span><span class=
"special">,
</span>
108 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">size_t
</span> <span class=
"identifier">lm
</span><span class=
"special">):
</span>
109 <span class=
"identifier">channel_
</span><span class=
"special">(
</span> <span class=
"identifier">cp
</span><span class=
"special">),
</span>
110 <span class=
"identifier">limit_
</span><span class=
"special">(
</span> <span class=
"identifier">lm
</span><span class=
"special">)
</span> <span class=
"special">{
</span>
111 <span class=
"identifier">assert
</span><span class=
"special">(
</span><span class=
"identifier">channel_
</span><span class=
"special">);
</span>
112 <span class=
"keyword">if
</span> <span class=
"special">(
</span> <span class=
"number">0</span> <span class=
"special">==
</span> <span class=
"identifier">limit_
</span><span class=
"special">)
</span> <span class=
"special">{
</span>
113 <span class=
"identifier">channel_
</span><span class=
"special">-
></span><span class=
"identifier">close
</span><span class=
"special">();
</span>
114 <span class=
"special">}
</span>
115 <span class=
"special">}
</span>
117 <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">fibers
</span><span class=
"special">::
</span><span class=
"identifier">channel_op_status
</span> <span class=
"identifier">push
</span><span class=
"special">(
</span> <span class=
"identifier">T
</span> <span class=
"special">&&</span> <span class=
"identifier">va
</span><span class=
"special">)
</span> <span class=
"special">{
</span>
118 <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">fibers
</span><span class=
"special">::
</span><span class=
"identifier">channel_op_status
</span> <span class=
"identifier">ok
</span> <span class=
"special">=
</span>
119 <span class=
"identifier">channel_
</span><span class=
"special">-
></span><span class=
"identifier">push
</span><span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">forward
</span><span class=
"special"><</span> <span class=
"identifier">T
</span> <span class=
"special">>(
</span> <span class=
"identifier">va
</span><span class=
"special">)
</span> <span class=
"special">);
</span>
120 <span class=
"keyword">if
</span> <span class=
"special">(
</span> <span class=
"identifier">ok
</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">channel_op_status
</span><span class=
"special">::
</span><span class=
"identifier">success
</span> <span class=
"special">&&</span>
121 <span class=
"special">--
</span><span class=
"identifier">limit_
</span> <span class=
"special">==
</span> <span class=
"number">0</span><span class=
"special">)
</span> <span class=
"special">{
</span>
122 <span class=
"comment">// after the 'limit_'th successful push, close the channel
</span>
123 <span class=
"identifier">channel_
</span><span class=
"special">-
></span><span class=
"identifier">close
</span><span class=
"special">();
</span>
124 <span class=
"special">}
</span>
125 <span class=
"keyword">return
</span> <span class=
"identifier">ok
</span><span class=
"special">;
</span>
126 <span class=
"special">}
</span>
128 <span class=
"keyword">private
</span><span class=
"special">:
</span>
129 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">shared_ptr
</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">unbounded_channel
</span><span class=
"special"><</span> <span class=
"identifier">T
</span> <span class=
"special">></span> <span class=
"special">></span> <span class=
"identifier">channel_
</span><span class=
"special">;
</span>
130 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">size_t
</span> <span class=
"identifier">limit_
</span><span class=
"special">;
</span>
131 <span class=
"special">};
</span>
136 <a name=
"wait_all_values_source"></a>Armed with
<code class=
"computeroutput"><span class=
"identifier">nchannel
</span><span class=
"special"><></span></code>, we can implement
<code class=
"computeroutput"><span class=
"identifier">wait_all_values_source
</span><span class=
"special">()
</span></code>.
137 It starts just like
<a class=
"link" href=
"../when_any/when_any__return_value.html#wait_first_value"><code class=
"computeroutput"><span class=
"identifier">wait_first_value
</span><span class=
"special">()
</span></code></a>. The difference is that we wrap
138 the
<code class=
"computeroutput"><span class=
"identifier">unbounded_channel
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span></code>
139 with an
<code class=
"computeroutput"><span class=
"identifier">nchannel
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span></code>
140 to pass to the producer fibers.
143 Then, of course, instead of popping the first value, closing the channel
144 and returning it, we simply return the
<code class=
"computeroutput"><span class=
"identifier">shared_ptr
</span><span class=
"special"><</span><span class=
"identifier">unbounded_channel
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">>></span></code>.
148 <pre class=
"programlisting"><span class=
"comment">// Return a shared_ptr
<unbounded_channel
<T
>> from which the caller can
</span>
149 <span class=
"comment">// retrieve each new result as it arrives, until 'closed'.
</span>
150 <span class=
"keyword">template
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">Fn
</span><span class=
"special">,
</span> <span class=
"keyword">typename
</span> <span class=
"special">...
</span> <span class=
"identifier">Fns
</span> <span class=
"special">></span>
151 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">shared_ptr
</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">unbounded_channel
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">result_of
</span><span class=
"special"><</span> <span class=
"identifier">Fn
</span><span class=
"special">()
</span> <span class=
"special">>::
</span><span class=
"identifier">type
</span> <span class=
"special">></span> <span class=
"special">></span>
152 <span class=
"identifier">wait_all_values_source
</span><span class=
"special">(
</span> <span class=
"identifier">Fn
</span> <span class=
"special">&&</span> <span class=
"identifier">function
</span><span class=
"special">,
</span> <span class=
"identifier">Fns
</span> <span class=
"special">&&</span> <span class=
"special">...
</span> <span class=
"identifier">functions
</span><span class=
"special">)
</span> <span class=
"special">{
</span>
153 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">size_t
</span> <span class=
"identifier">count
</span><span class=
"special">(
</span> <span class=
"number">1</span> <span class=
"special">+
</span> <span class=
"keyword">sizeof
</span> <span class=
"special">...
</span> <span class=
"special">(
</span> <span class=
"identifier">functions
</span><span class=
"special">)
</span> <span class=
"special">);
</span>
154 <span class=
"keyword">typedef
</span> <span class=
"keyword">typename
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">result_of
</span><span class=
"special"><</span> <span class=
"identifier">Fn
</span><span class=
"special">()
</span> <span class=
"special">>::
</span><span class=
"identifier">type
</span> <span class=
"identifier">return_t
</span><span class=
"special">;
</span>
155 <span class=
"keyword">typedef
</span> <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">fibers
</span><span class=
"special">::
</span><span class=
"identifier">unbounded_channel
</span><span class=
"special"><</span> <span class=
"identifier">return_t
</span> <span class=
"special">></span> <span class=
"identifier">channel_t
</span><span class=
"special">;
</span>
156 <span class=
"comment">// make the channel
</span>
157 <span class=
"keyword">auto
</span> <span class=
"identifier">channelp
</span><span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">make_shared
</span><span class=
"special"><</span> <span class=
"identifier">channel_t
</span> <span class=
"special">>()
</span> <span class=
"special">);
</span>
158 <span class=
"comment">// and make an nchannel facade to close it after 'count' items
</span>
159 <span class=
"keyword">auto
</span> <span class=
"identifier">ncp
</span><span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">make_shared
</span><span class=
"special"><</span> <span class=
"identifier">nchannel
</span><span class=
"special"><</span> <span class=
"identifier">return_t
</span> <span class=
"special">></span> <span class=
"special">>(
</span> <span class=
"identifier">channelp
</span><span class=
"special">,
</span> <span class=
"identifier">count
</span><span class=
"special">)
</span> <span class=
"special">);
</span>
160 <span class=
"comment">// pass that nchannel facade to all the relevant fibers
</span>
161 <span class=
"identifier">wait_all_values_impl
</span><span class=
"special"><</span> <span class=
"identifier">return_t
</span> <span class=
"special">>(
</span> <span class=
"identifier">ncp
</span><span class=
"special">,
</span>
162 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">forward
</span><span class=
"special"><</span> <span class=
"identifier">Fn
</span> <span class=
"special">>(
</span> <span class=
"identifier">function
</span><span class=
"special">),
</span>
163 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">forward
</span><span class=
"special"><</span> <span class=
"identifier">Fns
</span> <span class=
"special">>(
</span> <span class=
"identifier">functions
</span><span class=
"special">)
</span> <span class=
"special">...
</span> <span class=
"special">);
</span>
164 <span class=
"comment">// then return the channel for consumer
</span>
165 <span class=
"keyword">return
</span> <span class=
"identifier">channelp
</span><span class=
"special">;
</span>
166 <span class=
"special">}
</span>
175 <pre class=
"programlisting"><span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">shared_ptr
</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">unbounded_channel
</span><span class=
"special"><</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">string
</span> <span class=
"special">></span> <span class=
"special">></span> <span class=
"identifier">channel
</span> <span class=
"special">=
</span>
176 <span class=
"identifier">wait_all_values_source
</span><span class=
"special">(
</span>
177 <span class=
"special">[](){
</span> <span class=
"keyword">return
</span> <span class=
"identifier">sleeper
</span><span class=
"special">(
</span><span class=
"string">"wavs_third"</span><span class=
"special">,
</span> <span class=
"number">150</span><span class=
"special">);
</span> <span class=
"special">},
</span>
178 <span class=
"special">[](){
</span> <span class=
"keyword">return
</span> <span class=
"identifier">sleeper
</span><span class=
"special">(
</span><span class=
"string">"wavs_second"</span><span class=
"special">,
</span> <span class=
"number">100</span><span class=
"special">);
</span> <span class=
"special">},
</span>
179 <span class=
"special">[](){
</span> <span class=
"keyword">return
</span> <span class=
"identifier">sleeper
</span><span class=
"special">(
</span><span class=
"string">"wavs_first"</span><span class=
"special">,
</span> <span class=
"number">50</span><span class=
"special">);
</span> <span class=
"special">});
</span>
180 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">string
</span> <span class=
"identifier">value
</span><span class=
"special">;
</span>
181 <span class=
"keyword">while
</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">channel_op_status
</span><span class=
"special">::
</span><span class=
"identifier">success
</span> <span class=
"special">==
</span> <span class=
"identifier">channel
</span><span class=
"special">-
></span><span class=
"identifier">pop
</span><span class=
"special">(
</span><span class=
"identifier">value
</span><span class=
"special">)
</span> <span class=
"special">)
</span> <span class=
"special">{
</span>
182 <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">cout
</span> <span class=
"special"><<</span> <span class=
"string">"wait_all_values_source() => '"</span> <span class=
"special"><<</span> <span class=
"identifier">value
</span>
183 <span class=
"special"><<</span> <span class=
"string">"'"</span> <span class=
"special"><<</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">endl
</span><span class=
"special">;
</span>
184 <span class=
"special">}
</span>
189 <a name=
"wait_all_values_impl"></a><code class=
"computeroutput"><span class=
"identifier">wait_all_values_impl
</span><span class=
"special">()
</span></code> really is just like
<a class=
"link" href=
"../when_any/when_any__return_value.html#wait_first_value_impl"><code class=
"computeroutput"><span class=
"identifier">wait_first_value_impl
</span><span class=
"special">()
</span></code></a>
190 except for the use of
<code class=
"computeroutput"><span class=
"identifier">nchannel
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span></code> rather than
<code class=
"computeroutput"><span class=
"identifier">unbounded_channel
</span><span class=
"special"><</span><span class=
"identifier">T
</span><span class=
"special">></span></code>:
194 <pre class=
"programlisting"><span class=
"keyword">template
</span><span class=
"special"><</span> <span class=
"keyword">typename
</span> <span class=
"identifier">T
</span><span class=
"special">,
</span> <span class=
"keyword">typename
</span> <span class=
"identifier">Fn
</span> <span class=
"special">></span>
195 <span class=
"keyword">void
</span> <span class=
"identifier">wait_all_values_impl
</span><span class=
"special">(
</span> <span class=
"identifier">std
</span><span class=
"special">::
</span><span class=
"identifier">shared_ptr
</span><span class=
"special"><</span> <span class=
"identifier">nchannel
</span><span class=
"special"><</span> <span class=
"identifier">T
</span> <span class=
"special">></span> <span class=
"special">></span> <span class=
"identifier">channel
</span><span class=
"special">,
</span>
196 <span class=
"identifier">Fn
</span> <span class=
"special">&&</span> <span class=
"identifier">function
</span><span class=
"special">)
</span> <span class=
"special">{
</span>
197 <span class=
"identifier">boost
</span><span class=
"special">::
</span><span class=
"identifier">fibers
</span><span class=
"special">::
</span><span class=
"identifier">fiber
</span><span class=
"special">(
</span> <span class=
"special">[
</span><span class=
"identifier">channel
</span><span class=
"special">,
</span> <span class=
"identifier">function
</span><span class=
"special">](){
</span>
198 <span class=
"identifier">channel
</span><span class=
"special">-
></span><span class=
"identifier">push
</span><span class=
"special">(
</span><span class=
"identifier">function
</span><span class=
"special">());
</span>
199 <span class=
"special">}).
</span><span class=
"identifier">detach
</span><span class=
"special">();
</span>
200 <span class=
"special">}
</span>
204 <div class=
"footnotes">
205 <br><hr width=
"100" align=
"left">
206 <div class=
"footnote"><p><sup>[
<a name=
"ftn.fiber.when_any.when_all_functionality.when_all__return_values.f0" href=
"#fiber.when_any.when_all_functionality.when_all__return_values.f0" class=
"para">6</a>]
</sup>
207 We could have used either
<a class=
"link" href=
"../../synchronization/channels.html#class_bounded_channel"><code class=
"computeroutput">bounded_channel
<></code></a> or
208 <a class=
"link" href=
"../../synchronization/channels.html#class_unbounded_channel"><code class=
"computeroutput">unbounded_channel
<></code></a>. We chose
<code class=
"computeroutput"><span class=
"identifier">unbounded_channel
</span><span class=
"special"><></span></code>
209 on the assumption that its simpler semantics imply a cheaper implementation.
213 <table xmlns:
rev=
"http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width=
"100%"><tr>
214 <td align=
"left"></td>
215 <td align=
"right"><div class=
"copyright-footer">Copyright
© 2013 Oliver Kowalke
<p>
216 Distributed under the Boost Software License, Version
1.0. (See accompanying
217 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>)
222 <div class=
"spirit-nav">
223 <a accesskey=
"p" href=
"when_all__simple_completion.html"><img src=
"../../../../../../../doc/src/images/prev.png" alt=
"Prev"></a><a accesskey=
"u" href=
"../when_all_functionality.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=
"when_all_until_first_exception.html"><img src=
"../../../../../../../doc/src/images/next.png" alt=
"Next"></a>