繁体   English   中英

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

[英]ASIO strand::wrap does it not have to serialize in order?

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

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

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

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

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

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

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

这条路

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

myhandnd保证myhandler1在myhandler2之前执行

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM