ASIO strand :: wrap它不需要按顺序序列化吗?

时间:2011-12-11 19:51:25

标签: multithreading boost asynchronous boost-asio

我迷失在使用strand :: wrap和strand :: post的帖子之间的区别?似乎既保证了序列化,又如何使用wrap进行序列化而不是获得一致的顺序?似乎他们俩都必须做同样的事情。我何时才能使用其中一个?

这是一个更详细的伪代码:

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

这保证了我的两个处理程序被序列化并按顺序执行,即使在线程池中也是如此。

现在,这与下面有什么不同?

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

好像他们做同样的事情? 为什么用一个而不是另一个?我看到两者都用过,我想弄清楚什么时候 一个比另一个更有意义。

2 个答案:

答案 0 :(得分:2)

wrap创建一个可调用对象,当调用该对象时,将在一个链上调用dispatch。如果你不调用wrap返回的对象,那么根本不会发生任何事情。因此,调用wrap的结果就像调用dispatch一样。现在与post相比如何?根据文档,postdispatch的不同之处在于它不允许在调用post的相同上下文(堆栈帧)内立即调用传递的函数。 / p>

所以wrappost在两个方面有所不同:他们行动的即时性,以及他们使用调用者自己的上下文来执行给定函数的能力。

我通过阅读documentation获得了所有这些。

答案 1 :(得分:2)

这样

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

mystrand保证myhandler1在myhandler2之前执行

但是

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

执行顺序是执行包装处理程序的顺序,io_service :: post不保证。