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

Return Errorcode

Boost , Chapter 1. Fiber , Integrating Fibers with Asynchronous Callbacks

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

errorcode. Если мы просто хотим, чтобы блокирующая обертка вернула это errorcode, это чрезвычайно простое использование promise<> и future<>:

AsyncAPI::errorcode write_ec( AsyncAPI & api, std::string const& data) {
    boost::fibers::promise< AsyncAPI::errorcode > promise;
    boost::fibers::future< AsyncAPI::errorcode > future( promise.get_future() );
    // In general, even though we block waiting for future::get() and therefore
    // won't destroy 'promise' until promise::set_value() has been called, we
    // are advised that with threads it's possible for ~promise() to be
    // entered before promise::set_value() has returned. While that shouldn't
    // happen with fibers::promise, a robust way to deal with the lifespan
    // issue is to bind 'promise' into our lambda. Since promise is move-only,
    // use initialization capture.
#if ! defined(BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES)
    api.init_write(
        data,
        [promise=std::move( promise)]( AsyncAPI::errorcode ec) mutable {
                            promise.set_value( ec);
                  });
#else // defined(BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES)
    api.init_write(
        data,
        std::bind([](boost::fibers::promise< AsyncAPI::errorcode > & promise,
                     AsyncAPI::errorcode ec) {
            promise.set_value( ec);
        },
        std::move( promise),
        std::placeholders::_1) );
#endif // BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURES
    return future.get();
}

Все, что нам нужно сделать, это:

  1. Instantiate a promise<> правильного типа.
  2. Получить его будущий<>.
  3. Установить для обратного вызова промысловый::set_value().
  4. Блок на будущее::get().
[Note]Note

Эта тактика для возобновления ожидающего волокна работает, даже если обратный вызов вызван на другую нить, чем тот, на котором запущено волокно. На самом деле, пример программы’s dummy AsyncAPI реализация иллюстрирует, что: она имитирует async I/O, запуская новую нить, которая ненадолго спит, а затем вызывает соответствующий вызов.


PrevUpHomeNext

Статья Return Errorcode раздела Chapter 1. Fiber Integrating Fibers with Asynchronous Callbacks может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Integrating Fibers with Asynchronous Callbacks ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 07:44:58/0.0077049732208252/1