我boost::asio
在一个非常复杂的场景中使用,我遇到了一个问题,即尽管有几个工作线程正在运行并且处于空闲状态,boost::asio::io_service::strand
但未执行发布到对象的方法。io_service
正如我所说,场景非常复杂,我仍在尝试开发一个相当小的重现场景。但条件如下:
- 一个 io_service 正在运行并分配了一个工作对象
- 将 4 个工作线程分配给 io_service(
io_service::run
在每个工作线程上调用) - 几个链对象用于发布许多不同的任务
- 在通过链执行的一些任务中,新任务被发布到链
整个系统运行良好且稳定,除了一种情况:当调用其中一个类的析构函数时,它将中止处理程序发布到链(以与其他任务同步启动中止),然后等待中止完成。现在每隔一段时间就会发生一次,永远不会执行中止处理程序(从另一个 strand 对象的调用中调用析构函数)。
我认为问题在于 strand 等待在已发布的同一线程上执行处理程序。并且由于该线程正在等待执行中止处理程序,因此程序死锁。
我现在的问题: - 我的假设是否正确?- 有什么办法可以避免这种情况?- 你将如何解决这个问题(有几个异步任务正在运行并且需要同步中止它们)
非常感谢您的帮助!
米。