c++ - boost::asio 绞合线程不能立即工作
问题描述
我最近用过boost::asio::strand
。我对此缺乏经验。
我所面临的,如果我打电话给function1
withstrand::wrap()
并打电话function2
给strand::wrap()
in ~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::strand 对象调度的处理程序同时执行。
启动异步操作时,每个回调处理程序都使用 boost::asio::strand 对象进行包装。strand::wrap() 函数返回一个新的处理程序,该处理程序通过 boost::asio::strand 对象自动分派其包含的处理程序。通过使用相同的 boost::asio::strand 包装处理程序,我们确保它们不能同时执行。
我必须做些什么来执行function2
而不等待function1
完成?(我知道我可以在没有线程或链的情况下执行它,但我想用 调用它strand::wrap()
)
解决方案
Strands 被明确设计为一次只允许执行一个函数。
如果您使用的是异步方法,那么当一个函数正在等待异步方法返回时,其他函数将被允许在同一链上执行。
如果您不使用异步方法,则 strands 将简单地按您观察到的串行执行发布的函数。
推荐阅读
- java - Selenium --> 如何从 li 类中选择按钮 [Java]
- swift - 使用 Alamofire 和 ObjectMapper 进行通用网络调用
- floating-point - 多个浮点数的锈蚀最大值?
- mysql - switch 语句中的奇怪结果
- typescript - Typescript 类属性初始化顺序
- search - 无法使用带有通配符的 solr 查询搜索电子邮件 ID 字段
- python-3.x - 如何使用 python 中的日志记录模块制作两个日志文件?
- xml - 无法使用 XSL 在 XML 中打印特殊(非英语)字符(拉丁语、德语等)
- firebase - 如何从 Firebase 存储控制台下载多个文件?
- php - 转置 mysql 表中的数据