我迷失在使用strand :: wrap和strand :: post的帖子之间的区别?似乎既保证了序列化,又如何使用wrap进行序列化而不是获得一致的顺序?似乎他们俩都必须做同样的事情。我何时才能使用其中一个?
这是一个更详细的伪代码:
mystrand(ioservice);
mystrand.post(myhandler1);
mystrand.post(myhandler2);
这保证了我的两个处理程序被序列化并按顺序执行,即使在线程池中也是如此。
现在,这与下面有什么不同?
ioservice->post(mystrand.wrap(myhandler1));
ioservice->post(mystrand.wrap(myhandler2));
好像他们做同样的事情? 为什么用一个而不是另一个?我看到两者都用过,我想弄清楚什么时候 一个比另一个更有意义。
答案 0 :(得分:2)
wrap
创建一个可调用对象,当调用该对象时,将在一个链上调用dispatch
。如果你不调用wrap
返回的对象,那么根本不会发生任何事情。因此,调用wrap
的结果就像调用dispatch
一样。现在与post
相比如何?根据文档,post
与dispatch
的不同之处在于它不允许在调用post
的相同上下文(堆栈帧)内立即调用传递的函数。 / p>
所以wrap
和post
在两个方面有所不同:他们行动的即时性,以及他们使用调用者自己的上下文来执行给定函数的能力。
我通过阅读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不保证。