Повысьте Asio, поделитесь тем же io_service вдоль одноразовых объектов - PullRequest
0 голосов
/ 30 апреля 2018

Я разрабатываю программу, которая состоит из набора активных объектов, которые отправляют сообщения друг другу. Я использую один и тот же io_service для инициализации всех этих объектов. Так что они работают до конца жизни программного обеспечения.

Я использую активные объекты, скажем, один для файловой операции, другой для последовательного ввода-вывода, другой для подключения к локальной базе данных и один для передачи всех этих данных.

Однако я не был уверен в предметах с короткими жизнями. Я использую недолговечные объекты, чтобы открыть сокет tcp, чтобы отправить быстрое сообщение удаленной конечной точке, а затем немедленно утилизировать сокет. Я думаю сделать их также асинхронными.

Вопрос в том, должен ли я использовать один и тот же io_service для этих недолговечных объектов или я должен создать новый io_service для каждого сокета?

1 Ответ

0 голосов
/ 30 апреля 2018

Я разрабатываю программу, которая состоит из множества активных объектов, которые отправляют сообщения друг другу. Я использую один и тот же io_service для инициализации всех этих объектов. Так что они работают до конца жизни программного обеспечения.

Звучит как хорошая подгонка. Я бы порекомендовал использовать рецепт Криса Колхоффа, если вам нужны более эффективные операции на машинах с несколькими процессорами.

Однако я не мог быть уверен в предметах с короткими жизнями. Я использую недолговечные объекты, чтобы открыть сокет tcp, чтобы отправить быстрое сообщение удаленной конечной точке, а затем немедленно утилизировать сокет. Я думаю сделать их также асинхронными.

Нет ничего плохого в том, что у вас есть несколько (er) долгоживущих объектов asio io_service (например, вы можете создать столько же io_services, сколько имеется процессоров на машине), а также недолговечные объекты, которые используют io_service. Я бы сказал, что это более эффективно, так как вам не нужно запускать поток для вызова io_service::run на каждом (недолговечном?) Io_service, и вы можете избежать ненужного переключения контекста.

Делать сокеты асинхронными также необходимо, если вы хотите / должны избегать блокировок в ваших потоках, особенно если есть проблемы с сетью и т. Д.

...