Saturday, June 6, 2015

Timer Callback | tech::interview



Timer Callback | tech::interview
假设你在一个嵌入式系统下开发,提供了如下一个system function:

1
void register_system_timer_callback(unsigned long absolute_time, std::function<void()> callback);

这个函数的功能是用一个绝对时间点注册一个callback function。这个时间点你可以认为就是time(NULL)的返回值。当时间到时,系统会自动调用这个callback。
如果这个absolute_time是现在或者已经过去,那么立即调用它。但是系统同时只能注册一个callback,如果你调用这个函数多次,只有最后一次的才有效。
请写一个函数,实现多次timers/callbacks的注册和调用。
G家电面题,题目的思路是按照时间点的顺序来维护一个数据结构。每次调用一个回调时,将自动注册下一个。
比如现在有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

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts