有没有一个工作计时器的例子,每隔X秒钟使用C执行一些函数
我会很感激一个工作代码的例子。
你可以产生一个新的线程:
void *threadproc(void *arg) { while(!done) { sleep(delay_in_seconds); call_function(); } return 0; } ... pthread_t tid; pthread_create(&tid, NULL, &threadproc, NULL);
或者,您可以使用alarm(2)
或setitimer(2)
设置警报:
void on_alarm(int signum) { call_function(); if(!done) alarm(delay_in_seconds); // Reschedule alarm } ... // Setup on_alarm as a signal handler for the SIGALRM signal struct sigaction act; act.sa_handler = &on_alarm; act.sa_mask = 0; act.sa_flags = SA_RESTART; // Restart interrupted system calls sigaction(SIGALRM, &act, NULL); alarm(delay_in_seconds); // Setup initial alarm
当然,这两种方法都存在这样的问题,即定期调用的函数需要线程安全。
信号方法是特别危险的,因为它也必须是异步安全的,这是非常困难的,甚至像printf
这样简单的事情是不安全的,因为printf
可能分配内存,如果SIGALRM
中断了对malloc
的调用,麻烦,因为malloc
不可重入。 所以我不会推荐signal方法,除非你所做的只是在信号处理程序中设置一个标志,稍后通过一些其他功能来检查它,这将使你回到与线程版本相同的地方。
使用间隔定时器和信号有很多传统方法可以做到这一点,但是我将介绍两种现代方法:
POSIX timer_create
函数创建一个定时器,可以配置为在定时器到期时发送一次性或定期通知。 创建计时器时,您可以通过信号请求传递,也可以通过新线程请求传递。 由于使用正确的信号是复杂的(有一个严格的规则,你可以做什么,不能做信号处理程序,并经常违反规则“似乎工作”,直到你不幸),我会建议使用基于线程的交付。
这听起来很简单。 做一个新的线程进入一个循环睡觉,并做任何你需要做的每一次所需的时间已经过去。