В чем разница между использованием strand :: post и io_service :: post с помощью strand :: wrap? - PullRequest
4 голосов
/ 30 сентября 2011

В моем понимании, отправка обработчиков на объект strand означает:

  • Одновременно выполняется только один из опубликованных обработчиков.
  • Обработчики вызываются по порядку.

Публикация обработчиков непосредственно в io_service объекте и перенос их в strand::wrap также означает, что одновременно выполняется только один из опубликованных обработчиков, но не по порядку.

Есть ли другая разница? И как я могу запустить два (или более) разных вида работ (так, разные обработчики / функции) параллельно (в разных потоках) с помощью strand?

Ответы [ 2 ]

1 голос
/ 11 декабря 2011

Если вы хотите, чтобы они работали параллельно, не используйте подставки. Пряди для сериализации. Просто отправьте сообщение в службу и запустите службу в пуле потоков.

Но вы подняли хороший вопрос, на который я хотел бы, чтобы кто-то ответил. Что именно разница? Если wrap сериализует все обработчики, то как они могут выйти из строя, то есть кажется, что он делает то же самое, что и публикация через цепочку? Где бы вы использовали один над другим?

0 голосов
/ 26 февраля 2014

На самом деле strand - это очередь, поэтому отправка обработчика в io_service с помощью wrap - это то же самое, что не переносить, потому что каждый раз, когда вы публикуете его, вы делаете в отдельном временном strand (каждая очередьсодержит только один обработчик - все эти обработчики могут выполняться одновременно, потому что они не находятся в одном и том же strand).Если вам нужны сериализованные обработчики, они должны быть заключены в один и тот же объект strand (который поэтому содержит более одного обработчика).

...