Im просмотр функции asio use_future, чтение source code.asio :: use_future и цикл событий
Но не могу понять, как это работает. Скажем, если я называть
auto fut = async_write(sock, buffer, use_future)
fut
становится std::future
(в соответствии с исходным кодом). Теперь, если я звоню fut.get()
, я должен ждать завершения операции async и получить возвращаемое значение. В use_future.hpp
файл я вижу стандарт ASIO async_result
разрешения обработчика и так далее ..
Но если я блокировать на future::get()
вызова, как петля IO продолжать работать так, операцию можно выполнить? Создает ли системный поток?
Это имеет смысл. Но что, если 'use_future' используется внутри обработчиков, вызванных' io_service :: run'? Это снова затормозит. Кажется, эта функция не так безопасна, как кажется. = ( – PSIAlt
@PSIAlt Функции вызова, которые могут бесконечно блокироваться изнутри обработчиков, редко бывают безопасными. Когда я использую 'use_future', я использую его только из потоков, которые не обрабатывают службу ввода-вывода , и все асинхронные операции, которые инициируют эти потоки, используют 'use_future'. В этом подходе нет обработчиков пользователей, в которых могут выполняться блокирующие вызовы. –
, но это также означает, что вы должны использовать поток для каждого соединения, чтобы этот шаблон работал.Я лучше придерживаюсь yield_context вместо этого, он кажется более расширяемым. – PSIAlt