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

长基建站小语种网站制作

长基建站,小语种网站制作,茶叶公司网站模板,软文是什么意思通俗点定时器要求在固定的时间异步执行一个操作,比如boost库中的boost::asio::deadline_timer,以及MFC中的定时器。也可以利用c11的thread, mutex, condition_variable 来实现一个定时器。 1、使用C11中的thread, mutex, condition_variable来实现一个定时器。…

定时器要求在固定的时间异步执行一个操作,比如boost库中的boost::asio::deadline_timer,以及MFC中的定时器。也可以利用c++11的thread, mutex, condition_variable 来实现一个定时器。

1、使用C++11中的thread, mutex, condition_variable来实现一个定时器。
注:此算法会每一个任务创建一个线程,不推荐。推荐用最下面第2种时间轮算法

#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>
#include <condition_variable>class Timer {
public:Timer() :_expired(true), _try_to_expire(false) {}Timer(const Timer& t) {_expired = t._expired.load();_try_to_expire = t._try_to_expire.load();}~Timer() {Expire();}void StartTimer(int interval, std::function<void()> task) {if (_expired == false) {return;}_expired = false;std::thread([this, interval, task]() {while (!_try_to_expire) {std::this_thread::sleep_for(std::chrono::milliseconds(interval));task();}{std::lock_guard<std::mutex> locker(_mutex);_expired = true;_expired_cond.notify_one();}}).detach();}void Expire() {if (_expired) {return;}if (_try_to_expire) {return;}_try_to_expire = true;{std::unique_lock<std::mutex> locker(_mutex);_expired_cond.wait(locker, [this] {return _expired == true; });if (_expired == true) {_try_to_expire = false;}}}private:std::atomic<bool> _expired;std::atomic<bool> _try_to_expire;std::mutex _mutex;std::condition_variable _expired_cond;
};int main() {Timer t;t.StartTimer(1000, []() {std::cout << "Hello World!" << std::endl; });std::this_thread::sleep_for(std::chrono::seconds(4));t.Expire();return 0;
}

2、使用时间轮算法:Linux内核就有这个算法。这里也有一个用户态的实现供参考:github.com/facebook/folly。它的高精度版本能实现微妙级别的定时。下面是一个简单的时间轮定时器的C++实现。原文的代码有问题,不能循环定时,经修改已经支持:


#include <chrono>
#include <functional>
#include <list>
#include <mutex>
#include <thread>
#include <vector>class TimerWheel {
public:using Task = std::function<void()>;explicit TimerWheel(size_t wheel_size, int interval_ms): wheel_size_(wheel_size),interval_ms_(interval_ms),wheel_(wheel_size),current_index_(0) {}~TimerWheel() {Stop();}void Start() {if (running_) {return;}running_ = true;thread_ = std::thread([this]() {while (running_) {std::this_thread::sleep_for(std::chrono::milliseconds(interval_ms_));Tick();}std::cout << "timer oooops!" << std::endl;});thread_.detach();}void Stop() {if (!running_) {return;}running_ = false;if (thread_.joinable()) {thread_.join();}}void AddTask(int timeout_ms, Task task) {std::lock_guard<std::mutex> lock(mutex_);size_t ticks = timeout_ms / interval_ms_;size_t index = (current_index_ + ticks) % wheel_size_;size_t allindex = index;for (size_t i = 1 ; allindex < wheel_size_; i++){allindex = index * i;if (allindex >= wheel_size_)break;wheel_[allindex].push_back(task);}}private:void Tick() {std::lock_guard<std::mutex> lock(mutex_);auto& tasks = wheel_[current_index_];for (const auto& task : tasks) {task();}//tasks.clear();current_index_ = (current_index_ + 1) % wheel_size_;}private:size_t wheel_size_;int interval_ms_;std::vector<std::list<Task>> wheel_;size_t current_index_;bool running_ = false;std::thread thread_;std::mutex mutex_;
};

使用方法:
使用static声明以免被析构,可在cpp类外全局声明,第一个参数为任务容器最大数量,第二个参数为定时判断的毫秒数即最低检测时间单位

static TimerWheel timer(10, 1000);

在要使用的地方,启动并添加任务

timer.Start();
timer.AddTask(2000, []() {std::cout << "Task 1" << std::endl; });
timer.AddTask(3000, []() {std::cout << "Task 2" << std::endl; });

可以在需要的时候停止

timer.Stop();

原文链接:https://blog.csdn.net/sinat_28305511/article/details/131495316

http://www.yayakq.cn/news/171654/

相关文章:

  • 天津市哪里有做网站广告的中国能源建设股份有限公司新网站
  • 小公司网站建设龙口市规划建设局网站
  • 网站有多少个廊坊百度快速排名
  • 班级网页网站建设有口碑的大连网站建设
  • 个人网站备案需要多久怎么做算命的网站
  • 如何创建一个站点一个网站余姚什么
  • 网站建设最贵多少钱最近的新闻大事10条
  • 网站后期维护费用多少买正品去哪个网站最好
  • 有人做彩票网站吗手机端做网站软件
  • 网站导航如何优化深圳vi设计公司 全力设计
  • 如何做一个网站的功能吗线上推广渠道有哪些
  • 网站高端建设八亿免费建站
  • 如何做企业网站界面商城网站制作网站
  • 针织衫技术支持东莞网站建设福田欧曼est前四后八
  • 网站的框架马鞍山市网站建设公司
  • 上海微信网站公司视频直播app开发
  • 怎么用网站做远控在线网站建设价值
  • 宝洁公司网站建设案例为什么我自己做的网站百度不到
  • 丹徒网站建设机构手机网站开发c 教程
  • 网站备案需要哪些资料托管平台
  • 视频专用客户端appseo系统oem
  • python做网站php网站定制北京
  • 一个网站怎么做软件好用吗网站文章分类
  • 免费网站空间 推荐临沂网站建设哪家更好
  • 利用网站制作网页成都网络推广公司排行榜
  • 网站实现中英文dw做的网页在网站图片不显示
  • 网站建设模板代理建设手机行网站
  • 信息发布网站模板下载品牌推广方案怎么写
  • 建设网站设计论文范文女的做公关到底是干嘛的
  • 基于cms设计网站的背景意义图片列表wordpress主题