【问题标题】:ASIO strand::wrap does it not have to serialize in order?ASIO strand::wrap 不需要按顺序序列化吗?
【发布时间】:2011-12-11 19:51:25
【问题描述】:

我不知道使用 strand::wrap 和 strand::post 发布之间的区别?似乎两者都保证序列化但是你怎么能用 wrap 序列化而不得到一致的顺序?似乎他们都必须做同样的事情。我什么时候会使用其中一个?

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

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

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

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

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

似乎他们做同样的事情? 为什么要使用一个而不是另一个?我看到两个都用过,我想弄清楚什么时候 一个比另一个更有意义。

【问题讨论】:

    标签: multithreading boost asynchronous boost-asio


    【解决方案1】:

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

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

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

    【讨论】:

    • 对不起,我想我的问题太简短了。我的意思是: ioservice->post(strand.wrap(myhandler1)) ioservice->post(strand.wrap(myhandler2)) 和 strand.post(myhandler1) strand.post(myhandler2) 之间有什么区别是用 ioservice 创建的。我看到两者都使用过,似乎它们会做同样的事情,即按顺序序列化 myhandler1 和 myhandler2?
    【解决方案2】:

    这边

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

    myhandler1 由 mystrand 保证在 myhandler2 之前执行

    但是

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2016-07-01
      • 2021-11-22
      • 2020-10-03
      • 1970-01-01
      • 2021-10-10
      • 2017-08-29
      相关资源
      最近更新 更多