timerfd加epoll實現定時器簡單封裝

2021-10-07 18:56:30 字數 3078 閱讀 5621

封裝了乙個使用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檔案描述符集採用...