errorcode.
Если мы просто хотим, чтобы блокирующая обертка вернула это errorcode,
это чрезвычайно простое использование promise<> и
future<>:
AsyncAPI::errorcodewrite_ec(AsyncAPI&api,std::stringconst&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::errorcodeec)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::errorcodeec){promise.set_value(ec);},std::move(promise),std::placeholders::_1));#endif// BOOST_NO_CXX14_INITIALIZED_LAMBDA_CAPTURESreturnfuture.get();}
Эта тактика для возобновления ожидающего волокна работает, даже если обратный вызов вызван на другую нить, чем тот, на котором запущено волокно. На самом деле, пример программы’s dummy AsyncAPI реализация иллюстрирует, что: она имитирует async I/O, запуская новую нить, которая ненадолго спит, а затем вызывает соответствующий вызов.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.