bad_alloc)。Muduo Acceptor 採用 libev 作者建議:預留一個閒置 FD,accept 失敗時關閉閒置 FD 再 accept 獲取錯誤碼,再重開閒置 FD。但多線程下有 Race Condition。
設定略低於 Hard Limit 的 Soft Limit(如 1024 → 1000),超過主動 shutdown() 新連接,保留餘裕。單線程版實現:
class EchoServer {
// ...
int numConnected_ = 0;
const int kMaxConnections_;
public:
EchoServer(..., int maxConnections) : kMaxConnections_(maxConnections) {}
void onConnection(const TcpConnectionPtr& conn) {
if (conn->connected()) {
if (++numConnected_ > kMaxConnections_) conn->shutdown();
} else {
--numConnected_;
}
LOG_INFO << "numConnected = " << numConnected_;
}
};
多線程版將 numConnected_ 改為 muduo::AtomicInt32。shutdown() 前可發送飽和提示,幫助 Client 快速 Failover。
下一篇將介紹 Timing Wheel 處理空閒連接超時。