C ++ - несколько вопросов, связанных с Boost.Asio

0
  1. io_service::run() вызывается потоком A. Безопасно ли вызывать async_write из потока B?

  2. io_service::run() вызывается потоком A. Являются ли асинхронные операции, выполняемые потоком A или потоком A, гарантированным только обработчикам вызовов и за кулисами, могут быть дополнительные потоки, которые выполняют операции?

  3. io_service::run() вызывается потоком A. Некоторые async_read вызывают async_read и async_write используя тот же буфер. Можно ли предположить, что к буфере будет доступна не более одной операции за раз? Или это так, что только обработчики называются серийно, но за кулисами чтение и запись могут происходить одновременно?

  4. В документации говорится: "Программа должна убедиться, что поток не выполняет никаких других операций чтения (таких как async_read, функция async_read_some потока или любые другие async_read_some операции, выполняющие чтение), пока эта операция не завершится". Правильно ли это интерпретировать это как "Вы не должны выполнять более одной операции чтения в сокете одновременно, но вы можете выполнять 10 операций чтения на 10 различных сокетах".?

  5. Имея сокет, который на неопределенный срок принимает данные, является хорошей идеей вызывать async_read и вызывать его снова из обработчика async_read?

  6. Выполняет ли io_service::stop() все ожидающие операции async или просто перестает принимать новые и выполняет отложенные?

Теги:
boost-asio

2 ответа

3
Лучший ответ
  1. Да, обеспечение io_service привязано ко всему, что вызывает async_write. Однако следует отметить, что безопасно вызывать async_write из потока B, даже если вызов не вызывается: он будет вставлен в очередь в io_service и дождитесь завершения одного из входящих вызовов.
  2. Обратные вызовы, отправленные в io_service, будут выполняться в потоке A. Другие асинхронные операции (такие как операции с таймером) могут возникать в других потоках. То, что гарантировано быть на A, и то, что находится в его собственном потоке, определяется конкретным используемым объектом, а не io_service.
  3. Неа. Да-иш. Зависит от вызова класса io_service.
  4. Да.
  5. Да, на самом деле это очень распространено, так как оба гарантируют, что только один вызов async_read выполняется за один раз для данного сокета и что всегда существует "работа" для io_service.
  6. Обычно он завершает последний обратный вызов, а затем перестает принимать новые и прекращает обработку ожидающих. Он по-прежнему принимает новые, но вызывает вызов сброса перед вызовом любых других обратных вызовов.

io_service - это очередь сообщений (в основном), в то время как сокет, который отправляет свои сообщения в io_service, является чем-то другим.

1

1: Да

4: Да, нормально выполнять отдельные операции на разных сокетах.

5: Да, если вы проверите примеры того, как они это делают.

6: Учитывая, что в справочном руководстве сказано

Все вызовы функций run() или run_one() должны возвращаться как можно скорее.

Я бы сказал, что это может сделать.


Для чисел 2 и 6 источник доступен, поэтому лучший способ ответить на этот вопрос - загрузить и прочитать его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню