multithreading - ASIO strand::wrap 不是必须按顺序序列化吗?

标签 multithreading boost asynchronous boost-asio

我对使用 strand::wrap 和 strand::post 发帖之间的区别感到迷惑不解?似乎两者都保证序列化,但是如何使用 wrap 序列化而不获得一致的顺序?似乎他们都必须做同样的事情。我什么时候会使用一个?

下面是更详细的伪代码:

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

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

现在,这和下面有什么不同?
    ioservice->post(mystrand.wrap(myhandler1));
    ioservice->post(mystrand.wrap(myhandler2));

好像他们做同样的事情?
为什么要使用一个?我看到两者都使用过,并且正在尝试弄清楚什么时候
一个比另一个更有意义。

最佳答案

wrap创建一个可调用对象,当被调用时,它将调用 dispatch在一根绳子上。如果不调用 wrap 返回的对象,什么都不会发生。因此,调用 wrap 的结果就像打电话dispatch .现在与 post 相比如何? ?根据文档,post不同于 dispatch因为它不允许在 post 所在的相同上下文(堆栈帧)中立即调用传递的函数。叫做。

所以wrappost有两个不同之处:它们的 Action 的即时性,以及它们使用调用者自己的上下文来执行给定函数的能力。

我通过阅读 documentation 得到了这一切.

关于multithreading - ASIO strand::wrap 不是必须按顺序序列化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8466944/

相关文章:

c - 如何退出被信号量挂起的线程?

python - 多进程程序中线程与进程的关系

java - 为什么 Thread.stop 在 Thread.interrupt 不起作用的情况下不起作用?

c++ - 在 Windows 10 VS2015 上构建 Boost - 无法打开 *.lib

c++ - Boost Geometry 中用户定义的空间谓词

java - 使用线程更改数组中数据的有效方法

c++ - 是否有 BOOST 池固定大小的分配器?

javascript - 在异步方法中为数组赋值

python - 取消 python asyncio 中的嵌套协程

javascript - js : promises inside a while- true loop