Note that there are some explanatory texts on larger screens.

plurals
  1. POboost::asio::async_read 100% CPU usage on simple example
    primarykey
    data
    text
    <p>In boost::asio <a href="http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/echo/async_tcp_echo_server.cpp" rel="nofollow noreferrer">standard</a> <a href="http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/example/cpp11/chat/chat_server.cpp" rel="nofollow noreferrer">examples</a> after <code>async_accept()</code> the <code>socket</code> object is moving to the <code>session</code> object (which handles all <code>async_read()</code> calls) by initializing it as following:</p> <pre><code>std::make_shared&lt;session&gt;(std::move(socket_))-&gt;start(); </code></pre> <p>And when constructing a <code>session</code> it's moving again (isn't it reduntantly?):</p> <pre><code>session(tcp::socket socket) : socket_(std::move(socket)) </code></pre> <p>Then reading from a client is done as following:</p> <pre><code>boost::asio::async_read(socket_, ... </code></pre> <p>And all goes well. But when I trying to make <code>async_read()</code> not from the <code>session</code> object but directly from the <code>async_accept()</code> and use it's <code>socket</code> object, CPU is raising to 100% immediately after client connects. Why?</p> <pre><code>#include &lt;boost/asio.hpp&gt; using boost::asio::ip::tcp; class Server { public: Server(boost::asio::io_service&amp; io_service, const tcp::endpoint&amp; endpoint) : acceptor_(io_service, endpoint), socket_(io_service) { do_accept(); } private: void do_accept() { acceptor_.async_accept(socket_, [this](boost::system::error_code ec) { if (!ec) { char* buf = new char[5]; boost::asio::async_read(socket_, boost::asio::buffer(buf, 5), [this, buf](boost::system::error_code ec, std::size_t) { if (!ec) { std::cout.write(buf, 5); std::cout &lt;&lt; std::endl; } delete[] buf; }); } do_accept(); }); } tcp::acceptor acceptor_; tcp::socket socket_; }; int main(int argc, char* argv[]) { int port = 22222; boost::asio::io_service io_service; tcp::endpoint endpoint(tcp::v4(), port); new Server(io_service, endpoint); io_service.run(); } </code></pre> <p>Boost 1.49</p> <p><strong>EDIT</strong></p> <p>Thanks for the answers! I ended up by moving <code>socket_</code> before using it:</p> <pre><code>tcp::socket *socket = new tcp::socket(std::move(socket_)); </code></pre> <p>Also the same problem is discussed at <a href="https://stackoverflow.com/questions/17715794/repeated-stdmove-on-an-boostasio-socket-object-in-c11">Repeated std::move on an boost::asio socket object in C++11</a></p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload