在C中每x秒执行一次方法

有没有一个工作计时器的例子,每隔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计时器

POSIX timer_create函数创建一个定时器,可以配置为在定时器到期时发送一次性或定期通知。 创建计时器时,您可以通过信号请求传递,也可以通过新线程请求传递。 由于使用正确的信号是复杂的(有一个严格的规则,你可以做什么,不能做信号处理程序,并经常违反规则“似乎工作”,直到你不幸),我会建议使用基于线程的交付。

用线程滚动自己的计时器

这听起来很简单。 做一个新的线程进入一个循环睡觉,并做任何你需要做的每一次所需的时间已经过去。