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

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

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

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

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

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

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

===============>>#1 票数:2

这条路

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

myhandnd保证myhandler1在myhandler2之前执行

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

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

===============>>#2 票数:2

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

因此, wrappost有两种不同的方式:它们的动作的即时性,以及它们使用调用者自己的上下文来执行给定函数的能力。

我通过阅读文档得到了所有这些。

  ask by Oliver K translate from so

未解决问题?本站智能推荐: