我可以在C中实现单线程计时器吗?

时间:2018-01-16 14:37:36

标签: c linux timer

我尝试在C 中实施通信协议。我需要实现一个计时器(这样如果在一段时间之后还没有收到ACK,发送方将认为数据包已丢失并将再次发送)。

在C-looking-pseudocode中,我希望有这样的东西:

if (!ack_received(seqn) && timer_expired(seqn)) {
    send_packet(seqn);
    start_timer(seqn);
}

注意:seqn是正在发送的数据包的序列号。 每个数据包都需要一个个人计时器

如何实施timer_expiredstart_timer?有没有办法在不使用多个线程的情况下完成它?

2 个答案:

答案 0 :(得分:1)

  

我可以在C中实现单线程计时器吗?

可能不是纯手提式C99(或单线程C11,请参阅n1570)。

但在实践中,您通常会编写一些operating system的代码,然后您将获得一些定时器的方法。在Linux上,首先阅读time(7)。您可能还想使用多路复用调用,例如poll(2)(您给予延迟)。并详细了解其他system calls,请阅读intro(2)syscalls(2)和一些优秀的Linux编程手册(也许是旧的ALP,可以免费下载)。

顺便说一句,看来你正在编写网络相关的东西。你几乎需要一些API(例如Berkeley sockets),因此你可能会使用类似于操作系统的东西。

许多event loops是单线程的,但提供某种计时器。

或许(如果你没有任何操作系统)你正在为一些小型嵌入式硬件平台编写一些独立的C(例如Arduino - )。然后你有一些方法来轮询网络输入和设置计时器。

答案 1 :(得分:0)

取决于您系统的架构,它可以或多或少地以优雅的方式完成。

在具有单个线程的简单程序中,只声明包含起始时间戳的表。因此该函数只检查当前时间戳,保存的时间和超时值之间的差异。您需要实现另一个函数,该函数将初始化特定超时计数器的表元素。