|
|
||||||
boost::asio::io_service::stop()09.01.2014, 22:12. Показов 3869. Ответов 6
Метки нет (Все метки)
Читаю тут одну книгу и в ней есть такой пример по использованию boost::asio::io_service примерно вот такого содержимого:
P.S. Я только начал вникать в boost::asio.
0
|
||||||
| 09.01.2014, 22:12 | |
|
Ответы с готовыми решениями:
6
Boost.asio io_service.run не дожидается выполнения асинхронного чтения
|
|
Ушел с форума
|
||
| 09.01.2014, 22:41 | ||
|
Мне кажется, все работает именно так, как должно. Вы поставили в очередь
100 операций, затем из одного обработчика вызываете stop. Этот stop, видимо, тоже ставится в очередь, и пока до его обработки доходит дело, все операции успевают завершиться. Вот если здесь создать несколько рабочих потоков, которые крутились бы в io_service::run, то картина могла быть иной. Не забываем, что на Windows (кстати, ОС какая ?) Boost.Asio использует порты завершения ввода-вывода, а сигнал ставится в очередь порта с помощью функции PostQueuedCompletionStatus и, надо полагать, обрабатывается с таким же приоритетом, как и остальные I/O-операции. Т.е. последовательно. Кстати, в самом Boost.Asio по поводу io_service::stop пишут:
Необязательно сразу.
1
|
||
|
|
|||||||||||
| 10.01.2014, 00:33 [ТС] | |||||||||||
|
Я тогда просто недоумеваю, зачем этот пример тогда в книге дается? На всякий случай вот полный пример:
tasks_processor_base.hpp
main.cpp
P.S. Если это может зависить от ОС, то у меня Windows 8.1 64bit
0
|
|||||||||||
|
Ушел с форума
|
|||||||
| 10.01.2014, 01:08 | |||||||
|
Boost.Asio - это кросс-платформенная библиотека, и она в своих "потрохах"
использует разные платформо-зависимые вещи. На Windows используются порты завершения ввода-вывода (I/O Completion Ports, IOCP), на других системах - epoll/select и т.д. В зависимости от выбранного метода поведение может немного варьироваться. Думаю, данный случай - как раз из таких. Автор, скорее всего, не проверял свой код на Windows. Кстати, что за книга ? Если Вы почитаете в MSDN про IOCP, в особенности о работе таких функций, как GetQueuedCompletionStatus и PostQueuedCompletionStatus, то станет ясно, почему io_service::stop не останавливает работу io_service::run немедленно. Сигнал ставится в конец очереди и рабочий поток выгребает его оттуда только после того, как обработает все I/O-операции, стоящие в очереди перед ним. Кстати, в Boost можно отключить IOCP, тогда библиотека будет использовать менее эффективную модель select. Я ради интереса поставил в самом начале заголовка tasks_processor_base.hpp такую строчку:
Добавлено через 7 минут И еще хочу добавить, что данный пример несколько надуман. В реальных условиях такое бывает очень редко, чтобы io_service сначала нагрузили большим количеством операций, а затем их бы "разматывал" один поток. Как правило, потоков несколько (thread pool), а I/O-операции поступают и обрабатываются постепенно: запустили на сокете операцию чтения, получили сигнал завершения, запустили запись, снова ждем завершения, затем снова чтение и т.д. В этом случае очередь io_service поддерживается в состоянии, близком к пустому, поэтому если кто-то вызывает io_service::stop, остановка происходит практически без задержки.
1
|
|||||||
|
503 / 352 / 94
Регистрация: 22.03.2011
Сообщений: 1,112
|
|||
| 10.01.2014, 19:25 | |||
|
0
|
|||
|
Ушел с форума
|
||
| 10.01.2014, 19:40 | ||
|
А так да, очередь пуста - io_service::run возвращает управление. Если только не используется какой-нибудь io_service::work.
0
|
||
| 10.01.2014, 19:40 | |
|
Помогаю со студенческими работами здесь
7
Boost Asio C++ boost/asio Boost.asio boost::asio пример boost::asio cессии Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях.
Задача: при копировании документа очищать определенные реквизиты и табличную. . .
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
|
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
|
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора
Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если. . .
|