2015-07-20 3 views
1

Если я io_service::run() работает только в одном потоке, являются io_service::post() вызовы, выполненные в том же порядке, я заказываю их быть или они могут быть выполнены в произвольном порядке, и мне все еще нужно использовать strand для принудительного сериализованного выполнения?Serialize io_service :: пост() исполнение с io_service :: Run() вызывается только в одном потоке

ответ

3

Вопрос был рассмотрен раньше, например.

Это четко прописываются

, если любой из следующих условий:

  • 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 другой. Поэтому ни одно из вышеперечисленных условий не соблюдается, и не гарантируется.

+0

... но по-прежнему гарантируется, что вызов не является совпадающим. (правильно?) – Zero

+0

@Zero только на (неявной) нити. Который, когда у вас есть только 1 поток 'run()' -ing службы или явно сериализованные операции через 'strand' – sehe