2011-12-11 35 views
4

我失去了使用strand :: wrap和strand :: post之间的区别吗?看起来像保证序列化,但你怎么能序列化包装,而不是一致的顺序?似乎他们都必须做同样的事情。我什么时候会用另一种?ASIO strand :: wrap是否不必序列化?

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

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

,这保证我的两个处理程序是序列化,甚至在一个线程池的顺序执行。

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

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

似乎他们做同样的事情? 为什么使用一个而不是另一个?我看到两者都在使用,并且正试图弄清楚何时一个比另一个更有意义。

回答

1

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

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

我通过阅读documentation了解了这一切。

+1

对不起,我猜我的问题太简单了。我的意思是这样的: 有什么区别:(strand.wrap(myhandler1)) ioservice->后(strand.wrap(myhandler2)) 和 strand.post ioservice->后(myhandler1 ) strand.post(myhandler2) 其中strand是使用ioservice创建的。 我看到两者都被使用,看起来他们会做同样的事情,即序列化myhandler1和myhandler2? –

1

这样

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

myhandler1由mystrand保证前myhandler2

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

执行顺序来执行是执行包裹处理程序,io_service对象的顺序::帖子不保证。

相关问题