我有一个完全由数据驱动的主循环:它有一个阻塞调用来接收数据并将其存储为“最新的”(在别处访问)。每条数据都有相关的生命周期,之后数据超时并且不再被视为有效。每次收到数据时,我都会重置超时。
不幸的是,我当前只能在主要线程被新数据到达时唤醒时测试数据有效性。我需要能够在数据过期时触发事件,除非我在此期间收到新数据。
请有人建议解决方案吗?
如果有帮助,我安装了Boost v1.33.1 - 但无法更新到更新的版本。
答案 0 :(得分:3)
由于数据到期是异步事件,因此您需要使用异步计时器。在使用boost时,您可能需要查看Boost.Asio,它为您提供了可以与回调处理程序一起使用的deadline_timer
个对象。 (有关详细信息,请参阅here。)当计时器到期时,将调用回调处理程序,这将允许您检查数据的有效性。
编辑:啊......我刚刚注意到你遇到了Boost 1.33.1,它没有Asio。好吧,如果您被允许使用其他库,您可以使用Asio的non-boost version,否则您将需要依赖特定于操作系统的技术来实现异步计时器。您没有指定您的操作系统,但在POSIX兼容系统上,您可以使用select / poll进行超时。
实际上,你也可以使用一个后台线程,它会在下一个数据到期之前休眠,然后唤醒并检查所有数据的状态,然后再回到睡眠状态,直到下一个数据到期为止。你只需要小心,你要正确地同步一切,以避免竞争条件。