标签:调用 Timer muduo 线程 TimerQueue IO
简介
定时器功能由TimerId,Timer,TimerQueue实现,用户只能看到TimerId
TimerQueue只暴露两个接口addTimer和cancel,addTimer供eventloop使用,会包装成runat,runafter,runevery
实现
- TimerQueue需要快速找到已经到期的Timer,muduo使用std::map将Timer按到期时间先后排序,操作复杂度为O(logN),由于两个Timer到期时间可能相同,因此key设置为<Timestamp,Timer*>
- TimerQueue的成员函数只归所属IO线程调用,因此不必加锁
- getExpired会从TimerList中移除到期的Timer,并通过vector返回(编译器会实施RVO优化,不必担心性能)。
eventloop调用
runat,runafer,runevery都调用了addTimer,这三个函数应该运行跨线程,比如在某个IO线程超时回调。muduo不使用加锁解决,而使用runInloop把TimerQueue操作转移到IO线程进行
runInloop在IO线程执行某个用户任务回调。如果当前IO线程调用这个函数,回调会同步进行。如果用户在其他线程调用runinloop,cb会加入队列,io线程会被唤醒调用这个functor
有了这个功能,就可以轻易在线程间调配任务。由于IO线程平时阻塞在loop的poll调用,所以为了能立即执行用户回调,需要设法唤醒它。
标签:调用,Timer,muduo,线程,TimerQueue,IO 来源: https://www.cnblogs.com/lygin/p/16669004.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。