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

boost::asio strand wrapped thread is not working immediately

本文关键字:工作 线程 asio 缠绕 boost      更新时间:2023-10-16

我最近使用了boost::asio::strand。我在这方面缺乏经验。

我所面临的是,如果我在~function1中用strand::wrap()调用function1,用strand::wrap()调用function2,则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的处理程序,我们正在确保它们不能同时执行。

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

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

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

如果您不使用异步方法,那么strands将简单地以串行方式执行发布的函数,正如您所观察到的那样。