【问题标题】:How can i run a function after n seconds in C?如何在 C 中运行 n 秒后的函数?
【发布时间】:2020-07-08 00:31:54
【问题描述】:

我的项目是创建一个像 Memcached 这样的程序。该程序是存储键、值和缓存项的到期时间的列表。这意味着在 n 秒后数据将被删除。我想我可以使用struct 来存储键和值,但我无法在 n 秒后删除数据,你能给我一些解决方案吗?谢谢大家

【问题讨论】:

  • C 中的查找计时器。stackoverflow.com/questions/17167949/how-to-use-timer-in-c 还有一些特定于平台的 API,但由于您没有指定该平台,因此我无法链接您。
  • 我知道如何使用基本计时器,但我认为我的问题更大,我需要存储大量数据到结构,每个数据有不同的到期时间,当到期时间 = 0 时,我需要删除这个数据
  • 你的问题可以用这个定时器来解决。也就是说,如果由于某种原因它不适合,正如我所说的,您可以使用特定于平台的 API。例如,在 Linux 上,有 man7.org/linux/man-pages/man2/timer_create.2.html
  • 这段代码我只是用Dev-C写的,是lab C
  • 你能给我一些可以解决这个问题的函数吗,我的意思是如何运行一个函数在n秒后删除数据

标签: c


【解决方案1】:

只是懒惰地删除。

您无需立即删除过期数据。为了维护数据存储的语义,你只需要做两件事:

  1. 不向查询返回过期数据。 (但见下文。)

  2. 不允许数据存储区填满过期数据。

换句话说,当您碰巧遇到过期数据时删除它就足够了,因为它显示为对查询的响应,或者因为它占用了您需要存储更新的槽。

为了简化过期数据的检测,您应该在结构中存储实际的过期时间,而不是生存时间。然后很容易看出一个键/值对是否已经过期:您只需将过期时间与当前时间进行比较即可。

如果您使用链式哈希,您可以在搜索该链期间编辑哈希链(通过删除过期条目)。如果你使用开放寻址,你可以用墓碑替换过期的条目(或者你可以使用过期作为墓碑)。在这两种情况下,如果您找到要查找的键但条目已过期,则可以终止搜索,如果是查询则返回“键不存在”或用新数据覆盖数据(和到期时间)如果是更新。


注意:

  1. 数据存储不能真正保证永远不会返回过期数据,因为它不控制响应的网络延迟。它返回的数据很可能在从服务器发送出去的那一刻还没有过期,但是在它到达客户端时已经过期了。因此数据存储只能提供“尽力而为”,由客户端决定是否使用返回的数据(重要的是服务器返回到期时间以及数据作为对查询)。

    由于无论如何客户都必须检查到期时间,因此如果数据存储仅在更新条目时检查到期日期,则不会构成明确的技术违规行为。但由于不发送绝对过期数据的成本是如此之小,几乎不值得担心,因此将签入查询和更新包括在内似乎是合理的。

【讨论】:

    【解决方案2】:

    使用定时器怎么样?

    您可以使用 time.h 中的 time_t 结构和 clock() 函数。

    使用 clock() 将开始时间存储在 time_t 结构中并检查 通过比较存储时间和经过的时间之间的差异 当前时间。

    Here 已解释。

    【讨论】:

    • 这是一个糟糕的解决方案,因为它会导致进程不必要地消耗处理器时间。
    • 是的,但是我的问题是一次存储的数据不止一个,而且过期时间也不一样,我想一过期就删除那个数据,但是怎么能程序总是算数?每个数据的时间存储在结构中
    猜你喜欢
    • 2020-07-15
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多