封裝了乙個使用timerfd和epoll實現的定時器
我的思路是
標頭檔案
#ifndef cctimer_h_
#define cctimer_h_
#include "threadpool.h"
#include #include #include #include #include "safemap.h"
typedef std::functiontimercallback;
inline void memzero(void* p, size_t n)
struct timerinfo;
class cctimer ;
#endif
原始檔
#include "timer.h"
#include #include cctimer::cctimer(const size_t thread_count):
epollfd_(::epoll_create1(epoll_cloexec)),
events_(initeventlistsize_)
cctimer::~cctimer()
bool cctimer::settimeevent(const uint32_t timerid, const uint32_t ms, timercallback cb, const bool isperiodic)
int timerfd = ::timerfd_create(clock_monotonic,tfd_nonblock | tfd_cloexec);
if (timerfd < 0)
if (!timerfdsettime(timerfd, ms, isperiodic))
if (!epolladdtimerfd(timerid, timerfd))
timermap_[timerid].timerfunc = cb;
timermap_[timerid].isperiodic = isperiodic;
return true;
}bool cctimer::canceltimeevent(const uint32_t timerid)
if (!stoptimerfdsettime(timermap_[timerid].timerfd))
///< 從epoll迴圈中去掉fd的監聽
epolldeltimerfd(timermap_[timerid].timerfd);
///< 從map中刪除timerid
timermap_.erase(timerid);
return true;
}bool cctimer::timeridi***ist(const uint32_t timerid)
bool cctimer::timerfdsettime(const int timerfd, const uint32_t ms, const bool isperiodic)
newvalue.it_value.tv_nsec = (ms % 1000) * 1000;
if (isperiodic)
if (::timerfd_settime(timerfd, 0, &newvalue, null))
return true;
}bool cctimer::stoptimerfdsettime(const int timerfd)
return true;
}bool cctimer::epolladdtimerfd(const uint32_t timerid, const int timerfd)
return true;
}bool cctimer::epolldeltimerfd(const int timerfd)
return true;
}void cctimer::readtimerfd(int timerfd)
}void cctimer::handletimerfdinepoll()
else
if (!infoptr->isperiodic)
}///< 說明一次觸發的事件太多,擴大容量
if (static_cast(numevents) == events_.size())
}}
使用例子
#include "timer.h"
#include #include using namespace std;
void printanum(int a)
void printastring(std::string str)
int main (int argc, char** ar**)
標頭檔案
#pragma once
#include #include #include #include #include class thread_pool
data_->cond_.notify_one();
} private:
struct data ;
std::shared_ptrdata_;
private:
void run_in_thread();
};
原始檔
#include "threadpool.h"
thread_pool::thread_pool(const size_t thread_count)
: data_(std::make_shared())
}thread_pool::~thread_pool()
data_->cond_.notify_all(); }}
void thread_pool::run_in_thread() else if (data_->is_shutdown_) else
}}
執行緒池使用例子
void inthandler(int a)
int main(int argc, char **ar**)
return 0;
}
Epoll 模型實現
while true else if m events i data.fd m listen sock fd 如果新監測到乙個socket使用者連線到了繫結的socket埠,建立新的連線。else if m events i events epollin 如果是已經連線的使用者,並且收到資料,那麼進...
epoll 實現I O復用
epoll是linux特有的i o復用函式,它能顯著提高程式在大量併發連線中只有少量活躍的情況下的系統cpu利用率 並且epoll使用一組函式來完成任務,而不是單個函式,它無須遍歷整個被偵聽的描述符集,只要遍歷那些核心i o時間非同步喚醒而加入ready佇列的描述符集合即可。但epoll需要使用乙個...
epoll實現簡單socket通訊
epoll是常用的socket通訊方式,相比於select和poll來說,效率提公升了不止一點半點 其一 select中socket描述符 檔案描述符 集的資料結構為陣列,poll的檔案描述符集資料結構為鍊錶,無論陣列還是鍊錶,它們都是線性結構,當遍歷時,也只能線性遍歷 而epoll檔案描述符集採用...