首页 > 解决方案 > boost::asio 绞合线程不能立即工作

问题描述

我最近用过boost::asio::strand。我对此缺乏经验。

我所面临的,如果我打电话给function1withstrand::wrap()并打电话function2strand::wrap()in ~function1function2正在等待完成function1

ioservice->post(m_strand.wrap(boost::bind( function1 )));
    ioservice->post(m_strand.wrap(boost::bind( function2 )));  

如果我像这样更改代码,它会按我的预期工作

ioservice->post(m_strand.wrap(boost::bind( function1 )));
    ioservice->post((boost::bind( function2 )));

这是因为 m_strand 正在对函数调用进行排队吗?

我在搜索中发现了什么;

boost::asio::strand 保证,对于通过它调度的那些处理程序,一个正在执行的处理程序将被允许在下一个开始之前完成。无论调用 io_service::run() 的线程数如何,都可以保证这一点。当然,处理程序仍可能与其他未通过 boost::asio::strand 调度或通过不同的 boost::asio::strand 对象调度的处理程序同时执行。

启动异步操作时,每个回调处理程序都使用 boost::asio::strand 对象进行包装。strand::wrap() 函数返回一个新的处理程序,该处理程序通过 boost::asio::strand 对象自动分派其包含的处理程序。通过使用相同的 boost::asio::strand 包装处理程序,我们确保它们不能同时执行。

我必须做些什么来执行function2而不等待function1完成?(我知道我可以在没有线程或链的情况下执行它,但我想用 调用它strand::wrap()

标签: c++multithreadingboostboost-asio

解决方案


Strands 被明确设计为一次只允许执行一个函数。

如果您使用的是异步方法,那么当一个函数正在等待异步方法返回时,其他函数将被允许在同一链上执行。

如果您不使用异步方法,则 strands 将简单地按您观察到的串行执行发布的函数。


推荐阅读