overload6.html
5.82 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
136
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>co_spawn (6 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="overload5.html" title="co_spawn (5 of 6 overloads)">
<link rel="next" href="../connect.html" title="connect">
</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="overload5.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="../connect.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.overload6"></a><a class="link" href="overload6.html" title="co_spawn (6 of 6 overloads)">co_spawn (6 of 6
overloads)</a>
</h4></div></div></div>
<p>
Spawn a new coroutined-based thread of execution.
</p>
<pre class="programlisting">template<
typename ExecutionContext,
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(
ExecutionContext & ctx,
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_convertible< ExecutionContext &, execution_context & >::value >::type * = 0);
</pre>
<h6>
<a name="asio.reference.co_spawn.overload6.h0"></a>
<span><a name="asio.reference.co_spawn.overload6.parameters"></a></span><a class="link" href="overload6.html#asio.reference.co_spawn.overload6.parameters">Parameters</a>
</h6>
<div class="variablelist">
<p class="title"><b></b></p>
<dl>
<dt><span class="term">ctx</span></dt>
<dd><p>
An execution context that will provide the executor to 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.overload6.h1"></a>
<span><a name="asio.reference.co_spawn.overload6.example"></a></span><a class="link" href="overload6.html#asio.reference.co_spawn.overload6.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_io_context,
[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="overload5.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="../connect.html"><img src="../../../next.png" alt="Next"></a>
</div>
</body>
</html>