ASIOstrand::wrap 不需要按顺序序列化吗?

Oli*_*r K 5 multithreading boost asynchronous boost-asio

我不知道使用strand::wrap 和strand::post 进行发布之间的区别?看起来两者都保证序列化,但如何使用换行序列化而不获得一致的顺序?看起来他们都必须做同样的事情。我什么时候会使用其中一种而不是另一种?

这是更详细的伪代码:

    mystrand(ioservice);
    mystrand.post(myhandler1);
    mystrand.post(myhandler2);
Run Code Online (Sandbox Code Playgroud)

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

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

    ioservice->post(mystrand.wrap(myhandler1));
    ioservice->post(mystrand.wrap(myhandler2));
Run Code Online (Sandbox Code Playgroud)

看起来他们做同样的事情?为什么要使用其中一种而不是另一种?我看到两者都被使用,并试图找出什么时候一个比另一个更有意义。

Joh*_*nck 2

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

因此wrap和 之间post有两个不同点:操作的即时性,以及使用调用者自己的上下文来执行给定函数的能力。

我通过阅读文档得到了这一切。