Если я io_service::run()
работает только в одном потоке, являются io_service::post()
вызовы, выполненные в том же порядке, я заказываю их быть или они могут быть выполнены в произвольном порядке, и мне все еще нужно использовать strand
для принудительного сериализованного выполнения?Serialize io_service :: пост() исполнение с io_service :: Run() вызывается только в одном потоке
1
A
ответ
3
Вопрос был рассмотрен раньше, например.
- Does boost::asio::io_service preserve the order of handlers??
- Документация: Oreder Of Handler Invocations
Это четко прописываются
, если любой из следующих условий:
s.post(a)
происходит, перед темs.post(b)
- ...
затем
asio_handler_invoke(a1, &a1)
бывает-доasio_handler_invoke(b1, &b1)
.
Обратите внимание, что один IO поток создает неявных прядь (документов)
Примечание В связи с другим ответом: это, конечно, не имеет места, когда вызовы обработчиков являются выполняются неявно при завершении асинхронной операции.
Следует отметить, что в следующем случае:
async_op_1(..., s.wrap(a)); async_op_2(..., s.wrap(b));
завершение первой асинхронной операции будут выполнять
s.dispatch(a)
и второй будет выполнятьs.dispatch(b)
, но порядок, в котором те выполнены не определен , То есть вы не можете указать, произошел ли один -before другой. Поэтому ни одно из вышеперечисленных условий не соблюдается, и не гарантируется.
... но по-прежнему гарантируется, что вызов не является совпадающим. (правильно?) – Zero
@Zero только на (неявной) нити. Который, когда у вас есть только 1 поток 'run()' -ing службы или явно сериализованные операции через 'strand' – sehe