我最近使用过boost::asio::strand
。我对此没有经验。
如果我用function1
呼叫strand::wrap()
并用function2
,strand::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()
来调用它)
答案 0 :(得分:0)
子线经过明确设计,一次只能执行一个功能。
如果您使用的是异步方法,则当一个函数正在等待异步方法返回时,将允许其他函数在同一链上执行。
如果您不使用异步方法,那么strand会按照您观察到的那样简单地串行执行发布的函数。