Я новичок в Boost::asio и сейчас просматриваю io_context. У меня вопрос по поводу функции io_context::post Публикация в потоке может вытеснить то, что в данный момент выполняется в этом потоке? потому что в документации я видел: Устарело: используйте post.) Запросите io_context для вызова данного обработчика и немедленного возврата. Я ожидаю, что сообщение будет добавлено в очередь событий и будет считаться запущенным только тогда, когда управление будет передано обратно в цикл событий.
Нет, он не может прервать работающие потоки, связанные с io_context
. post()
ставит задачу в очередь io_context
, который в конечном итоге ее выполнит. «Немедленный возврат» подразумевается с точки зрения самого вызова post()
, а не задачи. Таким образом, функция post()
немедленно возвращается без блокировки, но задача запланирована на более позднее выполнение.
Asio не различает основной поток и неосновные потоки. Есть потоки, которые используются для запуска io_context
и будут работать в очереди задач, и могут быть и другие. Asio никогда не прерывает ни один поток.
В частности, вы не можете публиковать сообщения в ветке. Вы отправляете сообщение исполнителю, который обычно в конечном итоге ставится в очередь во внутреннюю очередь обработчика внутри контекста выполнения. Один или несколько потоков могут опрашивать этот контекст выполнения, и исполнитель может наложить дополнительные ограничения планирования.
Такое же поведение должно быть и с основным протектором? Я имею в виду, что нет никакой разницы между публикацией в основном потоке и не в основном потоке.