ASIO strand :: wrap не должен сериализоваться по порядку? - PullRequest
4 голосов
/ 11 декабря 2011

Я потерял различие между публикацией сообщений с использованием strand :: wrap и strand :: post? Похоже, что оба гарантируют сериализацию, но как можно сериализовать с помощью переноса и не получить последовательный порядок? Похоже, им обоим придется делать одно и то же. Когда бы я использовал один поверх другого?

Вот еще немного подробностей псевдокода:

    mystrand(ioservice);
    mystrand.post(myhandler1);
    mystrand.post(myhandler2);

это гарантирует, что два моих обработчика будут сериализованы и выполнены по порядку даже в пуле потоков.

Теперь, как это отличается от ниже?

    ioservice->post(mystrand.wrap(myhandler1));
    ioservice->post(mystrand.wrap(myhandler2));

Похоже, они делают то же самое? Зачем использовать один над другим? Я вижу, как используется, и пытаюсь выяснить, когда одно имеет больше смысла, чем другое.

Ответы [ 2 ]

2 голосов
/ 09 июля 2014

Так

mystrand(ioservice);
mystrand.post(myhandler1);
mystrand.post(myhandler2);

myhandler1 гарантированно выполняется mystrand до myhandler2

но

ioservice->post(mystrand.wrap(myhandler1));
ioservice->post(mystrand.wrap(myhandler2));

порядок выполнения - это порядок выполнения упакованных обработчиков, который io_service :: post не гарантирует.

2 голосов
/ 12 декабря 2011

wrap создает вызываемый объект, который при вызове вызовет dispatch в цепочке.Если вы не вызовете объект, возвращаемый wrap, ничего особенного не произойдет.Таким образом, вызов результата wrap подобен вызову dispatch.Как это можно сравнить с post?Согласно документации, post отличается от dispatch тем, что не позволяет сразу вызывать переданную функцию в том же контексте (стековый фрейм), где вызывается post.

Такwrap и post отличаются по двум причинам: непосредственность их действия и их способность использовать собственный контекст вызывающей стороны для выполнения данной функции.

Я получил все это, прочитав документацию .

...