overload5.html
5.86 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>co_spawn (5 of 6 overloads)</title>
<link rel="stylesheet" href="../../../boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.75.2">
<link rel="home" href="../../../index.html" title="Asio">
<link rel="up" href="../co_spawn.html" title="co_spawn">
<link rel="prev" href="overload4.html" title="co_spawn (4 of 6 overloads)">
<link rel="next" href="overload6.html" title="co_spawn (6 of 6 overloads)">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr><td valign="top"><img alt="asio C++ library" width="250" height="60" src="../../../asio.png"></td></tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="overload4.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../co_spawn.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="overload6.html"><img src="../../../next.png" alt="Next"></a>
</div>
<div class="section">
<div class="titlepage"><div><div><h4 class="title">
<a name="asio.reference.co_spawn.overload5"></a><a class="link" href="overload5.html" title="co_spawn (5 of 6 overloads)">co_spawn (5 of 6
overloads)</a>
</h4></div></div></div>
<p>
Spawn a new coroutined-based thread of execution.
</p>
<pre class="programlisting">template<
typename <a class="link" href="../Executor1.html" title="Executor requirements">Executor</a>,
typename F,
typename CompletionToken = <a class="link" href="../asynchronous_operations.html#asio.reference.asynchronous_operations.default_completion_tokens"><span class="emphasis"><em>DEFAULT</em></span></a>>
<a class="link" href="../asynchronous_operations.html#asio.reference.asynchronous_operations.automatic_deduction_of_initiating_function_return_type"><span class="emphasis"><em>DEDUCED</em></span></a> co_spawn(
const Executor & ex,
F && f,
CompletionToken && token = <a class="link" href="../asynchronous_operations.html#asio.reference.asynchronous_operations.default_completion_tokens"><span class="emphasis"><em>DEFAULT</em></span></a>,
typename enable_if< is_executor< Executor >::value||execution::is_executor< Executor >::value >::type * = 0);
</pre>
<h6>
<a name="asio.reference.co_spawn.overload5.h0"></a>
<span><a name="asio.reference.co_spawn.overload5.parameters"></a></span><a class="link" href="overload5.html#asio.reference.co_spawn.overload5.parameters">Parameters</a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">ex</span></dt>
<dd><p>
The executor that will be used to schedule the new thread of execution.
</p></dd>
<dt><span class="term">f</span></dt>
<dd><p>
A nullary function object with a return type of the form <code class="computeroutput">asio::awaitable<R,E></code>
that will be used as the coroutine's entry point.
</p></dd>
<dt><span class="term">token</span></dt>
<dd><p>
The completion token that will handle the notification that the thread
of execution has completed. If <code class="computeroutput">R</code> is <code class="computeroutput">void</code>,
the function signature of the completion handler must be:
</p></dd>
</dl>
</div>
<pre class="programlisting">void handler(std::exception_ptr);
</pre>
<p>
Otherwise, the function signature of the completion handler must be:
</p>
<pre class="programlisting">void handler(std::exception_ptr, R);
</pre>
<h6>
<a name="asio.reference.co_spawn.overload5.h1"></a>
<span><a name="asio.reference.co_spawn.overload5.example"></a></span><a class="link" href="overload5.html#asio.reference.co_spawn.overload5.example">Example</a>
</h6>
<pre class="programlisting">asio::awaitable<std::size_t> echo(tcp::socket socket)
{
std::size_t bytes_transferred = 0;
try
{
char data[1024];
for (;;)
{
std::size_t n = co_await socket.async_read_some(
asio::buffer(data), asio::use_awaitable);
co_await asio::async_write(socket,
asio::buffer(data, n), asio::use_awaitable);
bytes_transferred += n;
}
}
catch (const std::exception&)
{
}
co_return bytes_transferred;
}
// ...
asio::co_spawn(my_executor,
[socket = std::move(my_tcp_socket)]() mutable
-> asio::awaitable<void>
{
try
{
char data[1024];
for (;;)
{
std::size_t n = co_await socket.async_read_some(
asio::buffer(data), asio::use_awaitable);
co_await asio::async_write(socket,
asio::buffer(data, n), asio::use_awaitable);
}
}
catch (const std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
}, asio::detached);
</pre>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2003-2020 Christopher M.
Kohlhoff<p>
Distributed under the Boost Software License, Version 1.0. (See accompanying
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>)
</p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="overload4.html"><img src="../../../prev.png" alt="Prev"></a><a accesskey="u" href="../co_spawn.html"><img src="../../../up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../home.png" alt="Home"></a><a accesskey="n" href="overload6.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>