Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在C中实现单线程计时器吗?_C_Linux_Timer - Fatal编程技术网

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

我可以在C中实现单线程计时器吗?,c,linux,timer,C,Linux,Timer,我正在尝试用C实现一个通信协议。我需要实现一个计时器(这样,如果在一段时间后还没有收到ACK,发送方将假定数据包已丢失,并将再次发送) 在C-looking伪代码中,我希望有如下内容: if (!ack_received(seqn) && timer_expired(seqn)) { send_packet(seqn); start_timer(seqn); } 注意:seqn是正在发送的数据包的序列号每个数据包都需要一个个人计时器 如何实现计时器\u过期和启动

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

在C-looking伪代码中,我希望有如下内容:

if (!ack_received(seqn) && timer_expired(seqn)) {
    send_packet(seqn);
    start_timer(seqn);
}
注意:
seqn
是正在发送的数据包的序列号每个数据包都需要一个个人计时器


如何实现
计时器\u过期
启动计时器
?有没有一种不使用多个线程的方法呢?

取决于系统的体系结构,这种方法或多或少是优雅的

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

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

可能不是纯便携式C99(或单线程C11,请参阅)

但在实践中,您通常会为一些代码编写代码,然后您会找到一些使用计时器的方法。在Linux上,请先阅读。您可能还希望使用多路复用调用,例如(您给它一个延迟)。了解更多关于其他方面的信息,请阅读,以及一些好的Linux编程书籍(可能是旧的,可以免费下载)

顺便说一句,您似乎正在编写与网络相关的代码。实际上,您需要一些API(例如),因此您可能会使用类似于操作系统的东西

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


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

IO是非阻塞的吗?如果没有特定的系统,问题就太广泛了。这必须以特定于系统/操作系统的方式完成。此代码在哪个平台或操作系统上运行?请编辑您的问题以改进它(至少,通过更精确地标记它,例如Linux、winapi等)。如果它是Linux,则可以使用
timer\u create()
,检查此手册页以了解一种可能的方法。如果并发活动超时的数量很高,那么对绝对时间使用最小堆将更有效率(对于只有十几个或两个插槽,不用麻烦)。请注意,该示例安装的计时器信号处理程序没有
SA_RESTART
标志,因此它的交付将中断任何阻塞I/O操作(如果进程中只有一个线程)。或者,在Windows中,您将与WM_timer一起用于特定窗口。我的经验不太准确。另一种选择是抓取一些句柄,然后
WaitForSingleObject(一些句柄,延迟)。在不实现WindowProc回调的情况下工作。