Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Stackful Coroutines

Boost , Boost.Asio , Core Concepts and Functionality

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Функция spawn() представляет собой высокоуровневую обертку для выполнения сложенных корутин. Он основан на росте. Корутинная библиотека. Функция spawn() позволяет программам реализовывать асинхронную логику синхронно, как показано в следующем примере:

boost::asio::spawn(my_strand, do_echo);
// ...
void do_echo(boost::asio::yield_context yield)
{
  try
  {
    char data[128];
    for (;;)
    {
      std::size_t length =
        my_socket.async_read_some(
          boost::asio::buffer(data), yield);
      boost::asio::async_write(my_socket,
          boost::asio::buffer(data, length), yield);
    }
  }
  catch (std::exception& e)
  {
    // ...
  }
}

Первым аргументом для spawn() может быть strand, io_service или completion handler. Этот аргумент определяет контекст, в котором корутину разрешено выполнять. Например, объект каждого клиента сервера может состоять из нескольких корутин; все они должны работать на одной и той же strand, чтобы не требовалась явная синхронизация.

Второй аргумент — это объект функции с подписью:

void coroutine(boost::asio::yield_context yield);

который определяет код, который должен быть запущен как часть корутина. Параметр yield может быть передан асинхронной операции вместо обработчика завершения, как в:

std::size_t length =
  my_socket.async_read_some(
    boost::asio::buffer(data), yield);

Это запускает асинхронную операцию и приостанавливает корутин. Коротин будет возобновлен автоматически при завершении асинхронной операции.

Если подпись обработчика асинхронной операции имеет форму:

void handler(boost::system::error_code ec, result_type result);

функция инициации возвращает тип результата. В приведенном выше примере async_read_some это size_t. Если асинхронная операция не удается, error_code преобразуется в исключение system_error и выбрасывается.

Если подпись обработчика имеет форму:

void handler(boost::system::error_code ec);

функция инициации возвращает void. Как указано выше, ошибка передается обратно в корутин в виде исключения system_error.

Чтобы собрать error_code из операции, вместо того, чтобы сделать исключение, связать выходную переменную с yield_context следующим образом:

boost::system::error_code ec;
std::size_t length =
  my_socket.async_read_some(
    boost::asio::buffer(data), yield[ec]);

Примечание: если spawn() используется с пользовательским обработчиком завершения типа Handler, подпись объекта функции фактически:

void coroutine(boost::asio::basic_yield_context<Handler> yield);
See Also

spawn, yield_context, basic_yield_context, Spawn example (C++03), Spawn example (C++11), Stackless Coroutines.


PrevUpHomeNext

Статья Stackful Coroutines раздела Boost.Asio Core Concepts and Functionality может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Core Concepts and Functionality ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:22:14/0.0067319869995117/0