now - lastReceiveTime > 8s,連線數大時開銷大。利用固定大小(如 8 格)的循環隊列,每格代表 1 秒。指針每秒移動一格,到期格內的連線即被踢掉。新連線或收到資料的連線放入尾部格(剩餘壽命 7 秒)。優點:O(1) 插入/刪除,無需掃描全量,任務均攤到每秒。

收到資料時,將對應 Entry 移至當前尾部格,壽命重置為 7 秒。多條連線共存於同一格(Hash Set)。

typedef boost::weak_ptr<TcpConnection> WeakTcpConnectionPtr;
struct Entry : public muduo::copyable
{
Entry(const WeakTcpConnectionPtr& weakConn) : weakConn_(weakConn) {}
~Entry()
{
TcpConnectionPtr conn = weakConn_.lock();
if (conn) conn->shutdown(); // 引用計數歸零時自動斷開
}
WeakTcpConnectionPtr weakConn_;
};
typedef boost::shared_ptr<Entry> EntryPtr;
typedef boost::weak_ptr<Entry> WeakEntryPtr;
typedef boost::unordered_set<EntryPtr> Bucket;
typedef boost::circular_buffer<Bucket> WeakConnectionList;
不手動移動 Entry,而是利用 shared_ptr 引用計數:收到資料將 EntryPtr 放入當前桶(計數+1);定時器 push_back 空桶導致舊桶彈出銷毀,EntryPtr 計數-1,歸零觸發析構函數斷開連線。C++ RAUI 自動完成所有資源管理。
TcpConnection::setContext 存儲 WeakEntryPtr(弱引用),避免循環引用。若存強引用 EntryPtr,連線永不會超時(思考題)。onTimer() 僅一行:connectionBuckets_.push_back(Bucket());examples/idleconnection。