boost :: asio链缠绕的线程无法立即工作

时间:2019-01-23 06:35:22

标签: c++ multithreading boost boost-asio

我最近使用过boost::asio::strand。我对此没有经验。

如果我用function1呼叫strand::wrap()并用function2strand::wrap()中的~function1呼叫function2时遇到的事情正在等待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 :: strandobject调度的其他处理程序并发执行。

     

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

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

1 个答案:

答案 0 :(得分:0)

子线经过明确设计,一次只能执行一个功能。

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

如果您不使用异步方法,那么strand会按照您观察到的那样简单地串行执行发布的函数。