首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Muduo 定時器機制詳解:Timerfd、Timestamp 與 Asio/Netty 示例移植

     編輯:關於C++

Linux 時間函數選型

  • 計時:gettimeofday(微秒、x86-64 vsyscall 無陷入開銷、足夠精度)。Muduo Timestamp 用 int64_t 存微秒數,範圍 ±30 萬年。
  • 定時:timerfd_* 系列(FD 化、融入 Reactor、納秒精度、無信號麻煩)。拒絕 sleep/alarm (信號)、nanosleep (阻塞線程)、timer_create (信號限制)。

EventLoop 定時器介面

TimerId runAt(Timestamp, TimerCallback);   // 指定時刻
TimerId runAfter(double delay, TimerCallback); // 延遲秒數
TimerId runEvery(double interval, TimerCallback); // 週期觸發
void cancel(TimerId); // 待實現

回調在 IO 線程執行,與網絡回調同線程,無鎖。

Boost.Asio Timer 示例移植

  • Timer2:非阻塞定時。
  • Timer3:回調傳參。
  • Timer4:成員函數作回調(boost::bind(&Printer::print, this))。
  • Timer5/6:多線程回調保護共享變量(Mutex vs 縮小臨界區)。

代碼見 examples/asio/tutorial/timer2~6。

Java Netty Discard Server 移植(含流量統計)

使用 runEvery(3.0, ...) 定期打印吞吐量,AtomicInt64 記錄字節/消息數,支援 setThreadNum() 多線程。完整代碼見 examples/netty/。

核心原則

非阻塞服務端編程中,絕對不能用 sleep 等阻塞方式等待,否則主事件循環掛起,無法處理 IO。定時任務應轉為特定消息,到時觸發回調。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved