Здравствуйте, antropolog, Вы писали:
A>в азио есть несколько политик по работе с асинхронностью, задаются так называемыми completion token, которые определяют механизм возврата результата асинхронной функции. В частности есть токен use_future, для него асинх. операция возвратит фьючер
Супер, отлично! Но, стоит чуть усложнить логику и такой подход не работает:
void func1 ()
{
std::string line1;
std::future<std::size_t> future_read_1 = boost::asio::async_read_until(socket, boost::asio::dynamic_buffer(line1), '\n', boost::asio::use_future);
// какая-то логика тут
const size_t bytes_transferred = future1_read.get();
// какая-то логика тут
}
void func2 ()
{
std::string line2;
std::future<std::size_t> future_read_2 = boost::asio::async_read_until(socket, boost::asio::dynamic_buffer(line2), '\n', boost::asio::use_future);
// какая-то логика тут
const size_t bytes_transferred = future2_read.get();
// какая-то логика тут
}
void func3 ()
{
std::string line3;
std::future<std::size_t> future_read_3 = boost::asio::async_read_until(socket, boost::asio::dynamic_buffer(line3), '\n', boost::asio::use_future);
// какая-то логика тут
const size_t bytes_transferred = future3_read.get();
// какая-то логика тут
}
...
С ассиметричными безстековыми корутинами можно ожидать func1(), func2(), func3() параллельно и будить по мере загрузки I/O.
Как такое проделать с boost::asio::use_future ?