gpt4 book ai didi

c - 在 C 工作线程中实现计时器的方法

转载 作者:太空宇宙 更新时间:2023-11-04 01:14:31 24 4
gpt4 key购买 nike

我有一个从管道获取工作的工作线程。像这样

void *worker(void *param) {
while (!work_done) {
read(g_workfds[0], work, sizeof(work));
do_work(work);
}
}

我需要在同一个线程中实现一个 1 秒的计时器来记录工作。以下是我的想法:

void *worker(void *param) {
prev_uptime = get_uptime();
while (!work_done) {
// set g_workfds[0] as non-block
now_uptime = get_uptime();
if (now_uptime - prev_uptime > 1) {
do_book_keeping();
prev_uptime = now_uptime;
}
n = poll(g_workfds[0], 1000); // Wait for 1 second else timeout
if (n == 0) // timed out
continue;
read(g_workfds[0], work, sizeof(work));
do_work(work); // This can take more than 1 second also
}
}

我使用的是系统正常运行时间而不是系统时间,因为在该线程运行时系统时间可能会发生变化。我想知道是否还有其他更好的方法来做到这一点。我不想考虑使用另一个线程。使用 alarm() 不是一个选项,因为它已被同一进程中的另一个线程使用。这是在 Linux 环境中实现的。

最佳答案

我同意 webbi 在他的回答中所写的大部分内容。但是他关于使用时间而不是正常运行时间的建议存在一个问题。如果系统时间更新为“向前”,它将按预期工作。但是如果系统时间被设置为 30 秒,那么在 30 秒内将不会进行簿记,因为 (now_time - prev_time) 将为负数(除非使用无符号类型,在这种情况下它仍然可以工作)。

另一种方法是使用 clock_gettime() 和 CLOCK_MONOTONIC 作为 clockid ( http://linux.die.net/man/2/clock_gettime )。如果您不需要比秒更小的时间单位,那就有点乱了。

此外,添加代码来检测向后时钟跳变也不难。

关于c - 在 C 工作线程中实现计时器的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4817016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com