Timer Callback | tech::interview
Read full article from Timer Callback | tech::interview
假设你在一个嵌入式系统下开发,提供了如下一个system function:
|
|
这个函数的功能是用一个绝对时间点注册一个callback function。这个时间点你可以认为就是time(NULL)
的返回值。当时间到时,系统会自动调用这个callback。
如果这个absolute_time是现在或者已经过去,那么立即调用它。但是系统同时只能注册一个callback,如果你调用这个函数多次,只有最后一次的才有效。
请写一个函数,实现多次timers/callbacks
的注册和调用。
G家电面题,题目的思路是按照时间点的顺序来维护一个数据结构。每次调用一个回调时,将自动注册下一个。
比如现在有3个callback,按时间排序如下:
func1 -> func2 -> func3
首先注册func1,时间到时,系统调用func1。然后同时注册func2,以此类推。
那么只需要把传进来的callback做一次封装即可,当调用完毕后,我们需要做一个额外操作,也就是注册
因为要按照时间有序排列,我们需要一个map,以时间点为key。
比如现在有3个callback,按时间排序如下:
func1 -> func2 -> func3
首先注册func1,时间到时,系统调用func1。然后同时注册func2,以此类推。
那么只需要把传进来的callback做一次封装即可,当调用完毕后,我们需要做一个额外操作,也就是注册
下一个
callback。因为要按照时间有序排列,我们需要一个map,以时间点为key。
map<unsigned long, std::function<void()>> record;unsigned long current_timer = LONG_MAX;void wrapper() {record[current_timer]();record.erase(current_timer);if(!record.empty()) {auto it = record.begin();current_timer = it->first;register_system_timer_callback(it->first, std::function<void()>(wrapper));}}void register_timer_callback(unsigned long relative_time, std::function<void()> callback) {if(relative_time == 0) {callback();return;}auto cur_time = time(nullptr);record[cur_time + relative_time] = callback;if(cur_time + relative_time < current_timer) {current_timer = cur_time + relative_time;register_system_timer_callback(cur_time + relative_time, wrapper);}}
Read full article from Timer Callback | tech::interview