我是随便浏览某个时间队列看到的类似的代码

  mutable mutex mu_;
  condition_variable cv_;
  std::thread timer_thread_;
  std::atomic<bool> stop_{false};
  std::priority_queue<RCReference<TimerEntry>,
                      std::vector<RCReference<TimerEntry>>,
                      TimerEntry::TimerEntryCompare>
      timers_ TFRT_GUARDED_BY(mu_);

这个GUARDED_BY让人好奇,简单查证了一番,发现是clang的工具

简单说就是clang编译器带的一个多线程的帮手,线程安全注解,原理是拓展 __attribute__

比如 __attribute__(guarded_by(mutex))

这样指明依赖关系,更能方便定位问题

使用的话编译带上 -Wthread-safety-analysis就可以了

没发现gcc有类似的工具。可惜。

另外这些时间队列的实现用的 std::priority_queue 很有意思,都指定了容器参数(因为不是内建的类型,没有实现operator <)

我看rocksdb的timequeue长这样

  // Inheriting from priority_queue, so we can access the internal container
  class Queue : public std::priority_queue<WorkItem, std::vector<WorkItem>,
                                           std::greater<WorkItem>> {
   public:
    std::vector<WorkItem>& getContainer() { return this->c; }

直接把容器参数暴漏出来。挺新颖的。这个数据结构设计保留了c就是为了这样暴露吧。


ref

  • https://clang.llvm.org/docs/ThreadSafetyAnalysis.html
    • 可以直接把这个宏抄过去 http://clang.llvm.org/docs/ThreadSafetyAnalysis.html#mutex-h
      • https://github.com/tensorflow/runtime/blob/1f60e4778e91d9932ac04647769a178a9646c0a7/include/tfrt/support/thread_annotations.h 直接抄的
  • 原理论文 https://research.google.com/pubs/archive/42958.pdf
  • ppt介绍 https://llvm.org/devmtg/2011-11/Hutchins_ThreadSafety.pdf
  • 用法 1 https://stackoverflow.com/questions/40468897/clang-thread-safety-with-stdcondition-variable
  • 用法 2 https://zhuanlan.zhihu.com/p/47837673
  • std::priority_queue 看成员对象那一小节https://en.cppreference.com/w/cpp/container/priority_queue
  • 定时器实现总结 https://www.ibm.com/developerworks/cn/linux/l-cn-timers/index.html 文章写得很棒

重点关注最小堆(优先队列) 来维护定时器组,以及时间轮

  • https://www.zhihu.com/question/68451392 管理定时器,不一定需要timerqueue 暴力扫也不是不可以 只要timer不多
  • kafka中的时间轮 https://club.perfma.com/article/328984
  • https://www.cnblogs.com/zhongwencool/p/timing_wheel.html 他这个博客做的不错。。。