【问题标题】:C++ Data Timeout with Blocking Call阻塞调用的 C++ 数据超时
【发布时间】:2010-12-26 11:29:46
【问题描述】:

我有一个完全由数据驱动的主循环:它有一个阻塞调用来接收数据并将其存储为“最新”(在其他地方访问)。每条数据都有一个关联的生命周期,在此之后数据超时并且不再被认为是有效的。每次收到数据时,我都会重置超时。

不幸的是,我目前只能在新数据的到来唤醒主线程时测试数据的有效性。如果/当数据过期时,我需要能够触发事件,除非我同时收到新数据。

请问有人可以提出解决方案吗?

如果有帮助,我已经安装了 Boost v1.33.1 - 但无法更新到更新的版本。

【问题讨论】:

    标签: c++ multithreading timeout


    【解决方案1】:

    由于数据过期是一个异步事件,因此您需要使用异步计时器。当您使用 boost 时,您可能需要查看 Boost.Asio,它为您提供了可与回调处理程序一起使用的 deadline_timer 对象。 (有关详细信息,请参阅here。)当计时器到期时将调用回调处理程序,这将允许您检查数据的有效性。

    编辑: 啊……我刚刚注意到你被 Boost 1.33.1 困住了,它没有 Asio。好吧,如果您被允许使用其他库,您可以使用 Asio 的non-boost version,否则您将需要依赖特定于操作系统的技术来实现异步计时器。您没有指定您的操作系统,但在符合 POSIX 的系统上,您可以使用 select/poll 超时。

    其实你也可以使用一个后台线程,它会一直休眠到下一条数据过期,然后唤醒并检查所有数据的状态,然后再继续休眠直到下一条数据过期。您只需要注意正确同步所有内容以避免出现竞争条件。

    【讨论】:

    • “实际上,你也可以使用一个后台线程,它会一直休眠到下一条数据过期”——我现在有这个,但它不允许在数据过期时触发事件,例如线程正在为数据 A 休眠,数据 B 到达并超时,线程在数据 A 过期后唤醒。数据 B 从未触发过事件。
    猜你喜欢
    • 2013-11-16
    • 2016-10-18
    • 1970-01-01
    • 2020-11-07
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 2018-06-18
    相关资源
    最近更新 更多