首页
  • 上位机
  • 嵌入式
  • AI
  • Web
教程
MarkDown语法
有趣的项目
其他
GitHub
首页
  • 上位机
  • 嵌入式
  • AI
  • Web
教程
MarkDown语法
有趣的项目
其他
GitHub
  • TODO

TODO

时间轮代码示例 by Claude

好的,这里是一个使用C++和协程实现时间轮的示例代码,并添加了详细注释:

#include <coroutine>
#include <vector>
#include <queue>

struct Slot {
  std::queue<std::coroutine_handle<> > tasks;
};

class TimingWheel {
public:
  TimingWheel(int size) : wheelSize(size) {
    slots.resize(size);
  }

  // 添加任务协程
  void AddTask(int timeout, std::coroutine_handle<> task) {
    int index = GetIndex(timeout);
    slots[index].tasks.push(task); 
  }

  // 转动轮子
  void Tick() {
    // 执行当前槽任务
    auto& slot = slots[currentIndex]; 
    while(!slot.tasks.empty()) {
      slot.tasks.front()();
      slot.tasks.pop();
    }

    // 前进指针
    currentIndex++;
    currentIndex %= wheelSize;
  }

private:
  int GetIndex(int timeout) {
    return (currentIndex + timeout) % wheelSize; 
  }

  std::vector<Slot> slots;
  int wheelSize;
  int currentIndex = 0;
};

// 任务协程
std::coroutine_handle<> TaskA() {
  // do something
  co_await Suspend(); 
  // 等到下次调度
}

std::coroutine_handle<> TaskB() {
  // do something
  co_await Suspend();
}

int main() {
  TimingWheel wheel(60);

  wheel.AddTask(10, TaskA());

  for(int i = 0; i < 60; i++) {
    wheel.Tick();
  }

  return 0;
}  

主要通过co_await让出执行权限来实现协作调度,避免了线程中的抢占式切换。

协程让时间轮的调度逻辑更简洁,也无需考虑线程安全问题。可以灵活组合实现异步任务调度。