2013-10-19 44 views
2

在最近的一次采访中,有一个有趣的问题,就是这样。在定期时间间隔内调用函数的API

需要实现一个函数,它将接受函数指针和时间间隔。 它应该启用func1time_interval被调用。

我们为每个时钟周期提供一个API。 可以有多个对create_timer的调用,在这种情况下,它应该按照各自的时间间隔调用每个函数指针。

// api  
    create_timer(&func, interval) 

    // call to api would look like 
    create_timer(&func1, 10); 
    create_timer(&func2, 5); 

我建议建立一个函数指针链表,但在这种情况下,它是在每个时钟周期线性搜索。这不是一个好的解决方案。

我也提出了一个优先级队列解决方案,但那也没有解决。 我们需要存储的时间create_timer被调用各项功能,&然后计算与当前的时间差,然后&如果不同的是TIME_INTERVAL的倍数,我们调用该函数。

任何有趣的解决方案?

回答

1

“我建议建立一个函数指针链表”

注意,这种实现必须通过所有计划事件一遍又一遍在每一个新的滴答迭代,只是找出是否某些函数应该被调用或不被调用。

一个更好的办法是使用具有良好定义的顺序排序的数据结构,比方说,一个优先级队列,所有事件将在顺序排序,它们应该被处理/执行。即:

create_timer(&func1, 10); 
create_timer(&func2, 5); 
create_timer(&func3, 15); 

可能会导致以下优先级队列:

5 func1 
10 func2 
15 func3 

由当时的计时器将达到5蜱,它会调用func1,并从队列中删除它,然后它会插入回到队列,更新值为“last val + 5”:

10 func2 
10 func1 
15 func3 

等等。

+0

功能后遍历链接列表中有create_timer调用之后加以调用的时候,建议。我优先级队列的解决方案,但他不是满意。 – vindyz

+0

@vinay:查看我的编辑。也许它不够清楚 – LihO

0

这是一个很好的答案。为了避免在每个时间片上减少链接列表中的每个计时器,可以搜索将首先到期的计时器,并记下其到期时间。然后,每当滴答时间递减计时器,并在计数到期时,将剩余的计时器递减到所存储的时间,直到找到将要到期的下一个计时器,然后重复该过程。 这样,你只是一个计时器到期

相关问题