我正在处理一个与管理多个boost deadline timers有关的项目中的竞赛条件。该项目具有一个类,该类本质上是截止计时器的向量的包装器(我们将其称为TimerCollection
类),并具有一个公共scheduleWork
函数,该函数以ms为单位偏移,而std::function
并创建一个新的截止时间计时器,将其添加到向量中,并以async_await
作为处理程序调用{{1}}。
问题是std::function
定期清除过期的计时器,并通过检查basic_deadline_timer::expires_from_now <= 0来检查计时器是否已过期……问题在于计时器处理程序没有立即在计时器上执行到期后,据我了解,它们被放入队列中,并且IO服务将处理程序从该队列中移出,并在有能力的情况下执行它们,因此存在一种竞争条件,可以在执行处理程序之前删除计时器,以便处理程序最终被执行,错误代码为TimerCollection
。
我正在尝试解决该问题的方法-几个选择包括将指向计时器实例的共享指针传递到处理程序中,以在将计时器从向量中删除后使计时器保持活动状态,或者创建计时器包装器类,其中包含处理程序在执行时设置的字段,并让boost::asio::error::operation_aborted
在删除计时器之前检查此字段。这些解决方案虽然让我有点棘手-对于这种问题,是否有更好的方法/标准设计模式?