高级农民
- 积分
- 2716
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-6-18
- 最后登录
- 1970-1-1
|
这题目本身还是挺有意思的,主要是考怎么把功能受限的基础调用包装成更具表达能力的上层抽象,属于“造轮子”的一类题目,不过确实和ML/DL没什么关系就是..
我写了一份参考代码:
- #include <algorithm>
- #include <atomic>
- #include <chrono>
- #include <cstdint>
- #include <functional>
- #include <iostream>
- #include <mutex>
- #include <queue>
- #include <thread>
- void handle_hw_timer();
- ////////////////////////////////////////////////////////////////////////////////
- ///////////////////// 题目所提供的系统调用,这里用简易实现模拟了一下 ///////////////////
- ////////////////////////////////////////////////////////////////////////////////
- // (这个函数不用自己实现)
- std::int64_t get_current_time() {
- const auto now = std::chrono::high_resolution_clock::now();
- const auto ms = std::chrono::time_point_cast<std::chrono::milliseconds>(now);
- return ms.time_since_epoch().count();
- }
- // (这个函数不用自己实现)
- void set_hw_timer(int relative_timeout_ms) {
- static std::atomic<std::size_t> counter(0);
- const std::size_t serial = counter.fetch_add(1) + 1;
- std::thread t([relative_timeout_ms, serial] {
- if (relative_timeout_ms > 0) {
- std::this_thread::sleep_for(std::chrono::milliseconds(relative_timeout_ms));
- }
- if (counter.load() == serial) {
- handle_hw_timer();
- }
- });
- t.detach();
- }
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////// 需要自己写的部分 ///////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- // 定义timer结构体
- struct timer {
- std::int64_t wake_ts;
- void (*callback)();
- };
- struct timer_pointer_comparator {
- bool operator()(const timer *lhs, const timer *rhs) const {
- return lhs->wake_ts > rhs->wake_ts;
- }
- };
- // 这里如果是C语言,并且回调队列不会很长的话,也可以用链表结构
- std::priority_queue<const timer*,
- std::vector<const timer*>,
- timer_pointer_comparator> timer_events;
- std::mutex timer_events_mutex;
- // 处理callback并重置hardware timer.
- void handle_hw_timer() {
- std::unique_lock<std::mutex> lock(timer_events_mutex);
- const timer *event = timer_events.top();
- timer_events.pop();
- const bool is_empty = timer_events.empty();
- lock.unlock();
- std::thread worker([event] {
- event->callback();
- });
- worker.detach();
- if (!is_empty) {
- const auto delta_ts = timer_events.top()->wake_ts - get_current_time();
- set_hw_timer(std::max(0ll, delta_ts));
- }
- }
- // 注册新callback
- void set_timer(struct timer *t, int relative_timeout_ms, void (*callback)()) {
- t->wake_ts = get_current_time() + relative_timeout_ms;
- t->callback = callback;
- std::lock_guard<std::mutex> lock(timer_events_mutex);
- timer_events.push(t);
- const auto delta_ts = timer_events.top()->wake_ts - get_current_time();
- set_hw_timer(std::max(0ll, delta_ts));
- }
- ////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////// 测试 /////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////
- int main(int argc, char *argv[]) {
- struct timer t1, t2, t3;
- set_timer(&t1, 2000, [] { std::cout << "Hello -- A.2\n"; });
- set_timer(&t2, 3000, [] { std::cout << "Hello -- A.3\n"; });
- set_timer(&t3, 1000, [] { std::cout << "Hello -- A.1\n"; });
- std::this_thread::sleep_for(std::chrono::seconds(1));
- struct timer t4, t5, t6;
- set_timer(&t4, 2000, [] { std::cout << "Hello -- B.3\n"; });
- set_timer(&t5, 3000, [] { std::cout << "Hello -- B.4\n"; });
- set_timer(&t6, 1000, [] { std::cout << "Hello -- B.2\n"; });
- std::this_thread::sleep_for(std::chrono::seconds(5));
- }
复制代码 |
|