当前位置: 首页 > news >正文

郑州企业网站排名优化农林网站建设公司

郑州企业网站排名优化,农林网站建设公司,台州seo全网营销,wordpress制作模板一.定时器#xff08;timer#xff09;的需求 1.执行定时任务的时#xff0c;主线程不阻塞#xff0c;所以timer必须至少持有一个线程用于执行定时任务 2.考虑到timer线程资源的合理利用#xff0c;一个timer需要能够管理多个定时任务#xff0c;所以timer要支持增删任务…一.定时器timer的需求 1.执行定时任务的时主线程不阻塞所以timer必须至少持有一个线程用于执行定时任务 2.考虑到timer线程资源的合理利用一个timer需要能够管理多个定时任务所以timer要支持增删任务通过容器储存任务 3.当timer空闲时即没有任务或执行任务的时刻未到timer中的线程不应该空转来占用资源可通过条件变量实现 4.支持重复任务和非重复任务 二.定时器timer的实现 #include algorithm #include atomic #include chrono #include condition_variable #include functional #include map #include mutex #include thread #include iostream #include iomanip #include sstreamnamespace CC { using TaskFunc std::functionvoid();struct Task {uint64_t id;uint64_t period;bool repeated;TaskFunc func;bool removed;Task(uint64_t id, uint64_t period, bool repeated, TaskFunc func): id(id), period(period), repeated(repeated), func(func), removed(false){} };class Timer { public:Timer() : m_stop(false){m_worker std::thread(Timer::run, this);}~Timer(){m_stop.store(true);m_condition.notify_all();m_worker.join();}uint64_t add(uint64_t period_ms, bool repeated, TaskFunc func){uint64_t when now() period_ms;Task task(m_cur_id, period_ms, repeated, func);{std::lock_guardstd::mutex lock(m_tasks_mutex);m_tasks.insert({when, task});}m_condition.notify_all();return m_cur_id;}// Timer::remove并没有真正的将定时任务删除仅仅是将removed标志位设置为true删除操作实际是在Timer::run中进行的。// 为什么要这么做如果在这里如果由Timer::remove来执行m_tasks.erase(it)那么有可能删除的是Timer::run里正在执行的那个任务这是明显不对的。// 所以才采用将removed标志位设置为true的这种做法。bool remove(uint64_t id){bool flag false;std::lock_guardstd::mutex lock(m_tasks_mutex);std::multimapuint64_t, Task::iterator it std::find_if(m_tasks.begin(), m_tasks.end(),[id](const std::pairuint64_t, Task item) - bool { return item.second.id id; });if (it ! m_tasks.end()){it-second.removed true;flag true;}return flag;}private:std::thread m_worker;std::atomicbool m_stop;std::multimapuint64_t, Task m_tasks;std::mutex m_tasks_mutex;std::condition_variable m_condition;uint64_t m_cur_id;// m_condition.wait之后继续向下执行此时如果m_stop是true那么表明timer要被停止了那线程也要结束所以一个break跳出最开始的while (true)循环让线程执行结束。// 如果m_stop是false那表明现有可能有定时任务需要执行了。取出第一个任务m_tasks.begin()也是按时间排序最靠前的任务。用任务的时刻和当前时刻对比// 如果“时辰已到”那就执行。执行的之后需要注意的是要将锁释放lock.unlock()因为继续持有没有任何意义反而会阻塞住对m_tasks的一些操作。// 如果“时辰未到”那就执行m_condition.wait_for让当前线程休眠直到std::chrono::milliseconds(task_time - cur_time)这段时间过去或者被唤醒。void run(){while (true){std::unique_lockstd::mutex lock(m_tasks_mutex);m_condition.wait(lock, [this]() - bool { return !m_tasks.empty() || m_stop; });if (m_stop){break;}uint64_t cur_time now();std::multimapuint64_t, Task::iterator it m_tasks.begin();uint64_t task_time it-first;if (cur_time task_time){Task cur_task it-second;if (!cur_task.removed){lock.unlock();cur_task.func();lock.lock();if (cur_task.repeated !cur_task.removed){uint64_t when cur_time cur_task.period;Task new_task(cur_task.id, cur_task.period, cur_task.repeated, cur_task.func);m_tasks.insert({when, new_task});}}m_tasks.erase(it);}else{m_condition.wait_for(lock, std::chrono::milliseconds(task_time - cur_time));}}}uint64_t now() //ms{auto now std::chrono::system_clock::now();auto duration now.time_since_epoch();return std::chrono::duration_caststd::chrono::milliseconds(duration).count();} };} // namespace CC// 格式化时间精确到毫秒. std::string getTimeString() {auto now std::chrono::system_clock::now();auto duration now.time_since_epoch();auto millis std::chrono::duration_caststd::chrono::milliseconds(duration).count();std::time_t time std::chrono::system_clock::to_time_t(now);std::tm *tm std::localtime(time);std::stringstream ss;ss std::put_time(tm, %Y-%m-%d %H:%M:%S) . std::setw(3) std::setfill(0) millis % 1000;return ss.str(); }// 待执行的任务 void theTask(int id) {std::cout getTimeString() id id std::endl; }int main() {CC::Timer *timer new CC::Timer();timer-add(3000, false, std::bind(theTask, 1));uint64_t id timer-add(2000, true, std::bind(theTask, 2));timer-add(1000, true, std::bind(theTask, 3));std::this_thread::sleep_for(std::chrono::seconds(3));timer-remove(id);std::this_thread::sleep_for(std::chrono::seconds(1));delete timer;std::this_thread::sleep_for(std::chrono::seconds(1));return 0; } 参考链接https://zhuanlan.zhihu.com/p/668916073
http://www.w-s-a.com/news/162012/

相关文章:

  • 长沙 学校网站建设网站制作价格上海
  • 九江网站推广徽hyhyk1国家住房部和城乡建设部 网站首页
  • 阿克苏网站建设咨询动漫设计与制作属于什么大类
  • 网站编辑做多久可以升职wordpress版权修改
  • 网站开发维护成本计算国外外贸平台
  • 简单的招聘网站怎么做购物网站功能报价
  • 哪个网站做中高端衣服建设自己网站的流程
  • 网站建设概况做网站的是怎么赚钱的
  • 网站发布信息的基本流程现在都不用dw做网站了吗
  • 赣州热门网站深圳龙岗做网站的公司
  • 中国最大的建站平台广告传媒公司取名
  • 深圳网站设计公司专业吗学动漫设计后悔死了
  • 企业网站形象建设网站开发入职转正申请书
  • 网站设计步骤济南建设网中标公告
  • 石佛营网站建设wordpress关健词
  • 您的网站空间即将过期建站 discuz
  • 上海简站商贸有限公司福州哪家专业网站设计制作最好
  • 博客网站开发流程苏州专业做网站的公司哪家好
  • 四川手机网站建设西安 网站 高端 公司
  • 织梦大气绿色大气农业能源化工机械产品企业网站源码模版建筑工程知识零基础
  • 广州番禺网站公司v2017网站开发
  • 微信公众号怎么做微网站wordpress和dz
  • 西部数码网站管理助手 301福州搜索优化实力
  • 响应式网站介绍页面模板功能找不到
  • 公司网站如何seo自己做资讯网站
  • 天津网站建设软件开发招聘企业信用信息查询公示系统上海
  • 网站备案中做正品的网站
  • 网站建设0基础学起青海企业网站开发定制
  • 网站定制项目上海快速建站
  • 大型视频网站建设方案东莞企业网站建设开发