добавил пример обработки данных, считанных из сокета, в пуле потоков и запись результата обратно в сокет (и все это в псевдолинейном стиле)

This commit is contained in:
Selim Mustafaev 2014-11-08 22:21:13 +03:00
parent dcab8d1230
commit efe4b8f50f
2 changed files with 21 additions and 14 deletions

View File

@ -7,28 +7,24 @@ session::session(boost::asio::io_service &io_service): boost::asio::coroutine(),
{ {
} }
session::~session()
{
std::cout << "session destructor" << std::endl;
}
void session::start(boost::system::error_code ec, std::size_t bytes_transferred) void session::start(boost::system::error_code ec, std::size_t bytes_transferred)
{ {
if(!ec) if(!ec)
{ {
reenter(this) for(;;) reenter(this) for(;;) // псевдолинейный код
{ {
std::memset(_data, 0, 128); std::memset(_data, 0, 128);
yield _socket.async_read_some(boost::asio::buffer(_data, 128), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2)); yield _socket.async_read_some(boost::asio::buffer(_data, 128), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2));
std::cout << "async_read " << bytes_transferred << " bytes" << std::endl;
std::cout << "number: " << std::atoi(_data) << std::endl;
// yield _pool<int>.add_task([this]{ yield _fut = call_async<int>([this]{
// return 42; int n = std::atoi(_data);
// }); return n*n;
});
yield _socket.async_write_some(boost::asio::buffer(_data, 128), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2)); yield {
std::cout << "async_write" << std::endl; std::string res = std::to_string(_fut.get()) + "\n";
_socket.async_write_some(boost::asio::buffer(res), std::bind(&session::start, this, std::placeholders::_1, std::placeholders::_2));
}
} }
} }
else else

View File

@ -15,12 +15,23 @@ private:
char _data[128]; char _data[128];
threadpool _pool; threadpool _pool;
// "local" variables
std::future<int> _fut;
public: public:
session() = delete; session() = delete;
session(session&) = delete; session(session&) = delete;
session(boost::asio::io_service& io_service); session(boost::asio::io_service& io_service);
void start(boost::system::error_code ec = boost::system::error_code(), std::size_t bytes_transferred = 0); void start(boost::system::error_code ec = boost::system::error_code(), std::size_t bytes_transferred = 0);
~session();
template <typename R> std::future<R> call_async(std::function<R()> func)
{
return _pool.add_task<R>([this, &func]{
R result = func();
_socket.get_io_service().dispatch(std::bind(&session::start, this, boost::system::error_code(), 0));
return result;
});
}
}; };