加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 19:23:18 所属栏目:Linux 来源:网络整理
导读:是否有一个工作计时器的例子,它使用C每x秒执行一些函数. 我很欣赏一个工作代码示例. 最佳答案 你可以产生一个新的线程: void *threadproc(void *arg){ while(!done) { sleep(delay_in_seconds); call_function(); } return 0;}...pthread_t tid;pthread_cre

是否有一个工作计时器的例子,它使用C每x秒执行一些函数.

我很欣赏一个工作代码示例.

最佳答案
你可以产生一个新的线程:

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方法,除非你所做的只是在信号处理程序中设置一个标志,后来由其他一些函数检查,这会让你回到与线程版本相同的位置.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读