我正在编写一个简单的应用程序,以便在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/