我正在编写一个简单的应用程序,以便在Linux上每隔一段时间检查一些记录(x86/x86_64)
每个记录都有自己的检查间隔,可以在5到300秒之间。
这是记录结构:

...
typedef struct record_t {
    char name[256];
    time_t last_check;
    unsigned int interval;
    unsigned long amount;
    struct record_t *next;
} struct_t;
...

以及检查记录的线程:
...
/* records is a pointer to the first record in the linked list */
while(1) {
    for (current_record = records;
         current_record != NULL;
         current_record = current_record->next)
         {
            if(current_record->last_check + current_record->interval < time(0))
                update_record(current_record);
         }
    sleep(1);
}
...

记录列表的长度变化很大(例如从2到100000)
当列表中的每个元素都被按下时,这个过程会越来越慢…
有没有办法对它进行优化,或者对每个记录都有一个触发器
所以与其用循环来检查所有的东西,
当间隔通过时调用回调?
或多或少,我在javascript中寻找类似setInterval()的东西。
谢谢你的一切

最佳答案

实施定时轮。做一个301指针的数组。
不要像那样对记录排队,而是根据超时时间对它们排队。

while(1) {
    sleep (1);
    currIndx = (currIndx + 1) % 301;

    /* process the link list starting at that variable. */
    procQ = timerWheel[currIndx];

    /* re queue if necessay */

}

以及排队代码:
queIndx = (currIndx + timeout) % 301;
procQ = timerWheel[queIndx];
/* add at the head of link list */

关于c - 在C中实现定时事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25230474/

10-10 05:54