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

苏州比较大的设计公司上海优化网站seo公司

苏州比较大的设计公司,上海优化网站seo公司,网站开发本科论文,用dw制作个人简介网页步骤项目完整在: 文章目录 一、eventloop模块:进行事件监控,以及事件处理的模块二、提供的功能三、实现思想(一)功能(二)意义(三)功能设计 四、框架五、代码 一、eventloop模…

项目完整在:

文章目录

  • 一、eventloop模块:进行事件监控,以及事件处理的模块
  • 二、提供的功能
  • 三、实现思想
    • (一)功能
    • (二)意义
    • (三)功能设计
  • 四、框架
  • 五、代码

一、eventloop模块:进行事件监控,以及事件处理的模块

在这里插入图片描述

  • 进行事件监控管理的模块
  • 这个模块就是我们所说的One thread one loop 中的loop,也就是我们所说的Reactor
  • 这个模块必定是一个模块对于一个线程

二、提供的功能

这个模块和线程是一一对应的!
监听了一个链接,如果这个连接一旦就绪,就要进行事件处理!
但是如果这个描述符,在多个线程中都触发了了事件,进行处理,就会存在线程安全问题!
因此我们需要将一个链接的事件监控, 以及连接事件处理,以及其他操作都放在同一个线程中!
如何保证一个连接的所有操作都在eventloop对应的线程中!
给eventLOOP模块中,都添加一个任务队列!
对连接的所有操作,都进行一次封装,将对连接的操作当作任务都添加到任务队列中!

三、实现思想

(一)功能

  1. 在线程中对描述符进行事件监控!
  2. 有描述符就绪则对描述符进行事件处理,(如何保证处理回调函数中的操作都在线程中)
  3. 所有的就绪事件处理完了,这时候再去将任务队列中的所有任务一一执行! 这样能够保证对于所有链接的所有操作,都是在一个线程中进行的,不涉及线程安全问题!
    但是对于任务队列中的操作有线程安全的问题,只需要给task的操作架一把锁即可!

(二)意义

对于服务器的所有事件都是由EventLoop模块来完成
每一个Connection连接,都会绑定一个EventLoop模块和线程,因为外界对于连接的所有操作,都要放到同一个线程中进行!

(三)功能设计

  1. 事件监控
    使用Poller模块
    有事件就绪则进行事件处理!
  2. 执行任务队列中的任务!
    注意点:
    因为有可能因为等待描述符IO事件就绪,执行流流程阻塞,这个时候任务对立中的任务得不到执行!
    因此得有一个事件通知的东西,能够唤醒事件监控的阻塞!
    当事件就绪,需要处理的时候,处理过程中,如果对连接要进行某些操作!
    这些操作必须要在Eventloop对应的线程中进行,保证对连接的各项操作都是线程安全的。
  3. 如果执行的操作就在本线程中,不需要将操作压入队列了,可以直接执行!
  4. 如果执行的操作不在线程中,才需要加入任务池,等到事件处理完了之后就行执行任务!

四、框架

 class Eventloop {
private:std::thread::id _thread_id; // 线程IDint _event_fd // eventfd 唤醒IO事件监控有可能的阻塞!!!Poller _poller; // 进行所有描述符的事件监控using Functor = std::function<void()>;std::vector<Functor> _task; // 任务池std::mutex _mutex; // 实现任务池操作的线程安全!!!
public:void runAllTask();
public:Eventloop();void runInLoop(const Functor&cb); // 判断将要执行的任务是否处于当前线程中,如果是则执行,不是则压入队列。void queueInLoop(const Functor&cb);  // 将操作压入任务池!bool isInLoop(); //永远判断当前线程是否是EventLoop所对应的线程void updateEvent(Channel* channel); // 添加/修改描述符的事件监控void removeEvent(Channel* channel);  // 移除描述符的监控void Start(); // 任务监控完毕进行处理任务! 三步走:事件监控-》就绪事件处理-》执行任务};

五、代码


class EventLoop {
private:using Functor = std::function<void()>;std::thread::id _thread_id; // 线程IDint _event_fd; // eventfd 唤醒IO事件监控有可能的阻塞!!!std::unique_ptr<Channel> _event_channel; Poller _poller;//进行所有描述符的事件监控std::vector<Functor> _tasks; // 任务池std::mutex _mutex; // 实现任务池操作的线程安全!!!TimerWheel _timer_wheel;//定时器模块
public: // 执行任务池中的所有任务!!void runAllTask() {std::vector<Functor> functor; {std::unique_lock<std::mutex> _lock(_mutex); // 出了作用域,锁就会被解开!!_tasks.swap(functor);}for (auto &f : functor) {f();}return ;}static int createEventFd() {int efd = eventfd(0,EFD_CLOEXEC | EFD_NONBLOCK);if (efd < 0) {ERR_LOG("CREATE ENVENTED FAILED !!!");abort();}return efd;}void readEventfd() {uint64_t res = 0;int ret = read(_event_fd,&res,sizeof(res));if (ret < 0) {if (errno == EINTR || errno == EAGAIN) {return;}ERR_LOG("READ EVENTFD FAILED!");abort();}return ;}void weakEventFd() {uint64_t val = 1;int ret = write(_event_fd,&val,sizeof(val));if (ret < 0) {if (errno == EINTR) {return;}ERR_LOG("READ EVENTFD FAILED!");abort();}return ;}
public:EventLoop():_thread_id(std::this_thread::get_id()), _event_fd(createEventFd()), _event_channel(new Channel(this, _event_fd)),_timer_wheel(this) {//给eventfd添加可读事件回调函数,读取eventfd事件通知次数_event_channel->setReadCallback(std::bind(&EventLoop::readEventfd, this));//启动eventfd的读事件监控_event_channel->enableRead();}void runInLoop(const Functor&cb) { // 判断将要执行的任务是否处于当前线程中,如果是则执行,不是则压入队列。if (isInLoop()) {return cb();}}void queueInLoop(const Functor&cb) { // 将操作压入任务池!std::unique_lock<std::mutex> _lock(_mutex);//唤醒有可能因为没有事件就绪,而导致的epoll阻塞;//其实就是给eventfd写入一个数据,eventfd就会触发可读事件_tasks.push_back(cb);weakEventFd();}bool isInLoop() { //永远判断当前线程是否是EventLoop所对应的线程return (_thread_id == std::this_thread::get_id());}void updateEvent(Channel* channel) {// 添加/修改描述符的事件监控return _poller.UpdateEvent(channel); }void removeEvent(Channel* channel) {   // 移除描述符的监控return _poller.removeEvent(channel);}void TimerAdd(uint64_t id, uint32_t delay, const TaskFunc &cb) { return _timer_wheel.TimerAdd(id, delay, cb); }void TimerRefresh(uint64_t id) { return _timer_wheel.TimerRefresh(id); }void TimerCancel(uint64_t id) { return _timer_wheel.TimerCancel(id); }bool HasTimer(uint64_t id) { return _timer_wheel.HasTimer(id); }void Start() { // 任务监控完毕进行处理任务! // 三步走:事件监控-》就绪事件处理-》执行任务std::vector<Channel*> actives;_poller.Poll(&actives);for (auto &channel : actives) {channel -> handleEvent();}runAllTask();}};

文章转载自:
http://wanjiaendowmenfpolicy.gthc.cn
http://wanjiatersanctus.gthc.cn
http://wanjiaphenylalanine.gthc.cn
http://wanjiadermis.gthc.cn
http://wanjiasuitability.gthc.cn
http://wanjiaexpellent.gthc.cn
http://wanjiadishtowel.gthc.cn
http://wanjiatrendline.gthc.cn
http://wanjiaschvartze.gthc.cn
http://wanjiasignature.gthc.cn
http://wanjiaastonishing.gthc.cn
http://wanjiaslickenside.gthc.cn
http://wanjiacaptor.gthc.cn
http://wanjiaanisole.gthc.cn
http://wanjiawithdrew.gthc.cn
http://wanjiaenquiringly.gthc.cn
http://wanjiarochelle.gthc.cn
http://wanjiadogmata.gthc.cn
http://wanjiametamorphous.gthc.cn
http://wanjiayemeni.gthc.cn
http://wanjiasun.gthc.cn
http://wanjiaacoustician.gthc.cn
http://wanjiabatsman.gthc.cn
http://wanjiasapphism.gthc.cn
http://wanjianonconducting.gthc.cn
http://wanjiasteelworks.gthc.cn
http://wanjiaparthian.gthc.cn
http://wanjiacornland.gthc.cn
http://wanjiaagglutinate.gthc.cn
http://wanjiarasure.gthc.cn
http://wanjiaictus.gthc.cn
http://wanjiawickiup.gthc.cn
http://wanjiaattainability.gthc.cn
http://wanjiarhinolithiasis.gthc.cn
http://wanjiadeport.gthc.cn
http://wanjialanceted.gthc.cn
http://wanjiasorus.gthc.cn
http://wanjialevis.gthc.cn
http://wanjiaparonychia.gthc.cn
http://wanjiarewin.gthc.cn
http://wanjiaprimulaceous.gthc.cn
http://wanjiaindefinite.gthc.cn
http://wanjiabossy.gthc.cn
http://wanjiaimponderabilia.gthc.cn
http://wanjiathundersheet.gthc.cn
http://wanjiakeratinize.gthc.cn
http://wanjiahorra.gthc.cn
http://wanjiasensitive.gthc.cn
http://wanjiatriumviri.gthc.cn
http://wanjiainaccurate.gthc.cn
http://wanjiawesleyan.gthc.cn
http://wanjiastealthy.gthc.cn
http://wanjiagid.gthc.cn
http://wanjiabarroque.gthc.cn
http://wanjiadeserved.gthc.cn
http://wanjiayeld.gthc.cn
http://wanjiaestonian.gthc.cn
http://wanjiakraurotic.gthc.cn
http://wanjiaresister.gthc.cn
http://wanjiashanachy.gthc.cn
http://wanjiasemiarid.gthc.cn
http://wanjiadyspeptic.gthc.cn
http://wanjiaujjain.gthc.cn
http://wanjiadecoherence.gthc.cn
http://wanjiasell.gthc.cn
http://wanjiadisordered.gthc.cn
http://wanjiatamableness.gthc.cn
http://wanjiahyperkinetic.gthc.cn
http://wanjiacablet.gthc.cn
http://wanjiariffleman.gthc.cn
http://wanjiaeudaemonism.gthc.cn
http://wanjiascatoma.gthc.cn
http://wanjiaoverhand.gthc.cn
http://wanjiacraig.gthc.cn
http://wanjiaexultance.gthc.cn
http://wanjiatypescript.gthc.cn
http://wanjiaetypic.gthc.cn
http://wanjiaatomistic.gthc.cn
http://wanjiaforemilk.gthc.cn
http://wanjiadysaesthesia.gthc.cn
http://www.15wanjia.com/news/111320.html

相关文章:

  • 潍坊做网站哪个公司好牡丹江seo
  • 建站快车怎么样百度热度榜搜索趋势
  • 农村电商平台入口seo整站优化哪家专业
  • 徐州网站建设策划网站的推广优化
  • 织梦 茶叶网站互联网全媒体广告代理
  • 天津网站制作公司哪家好自己怎么免费做网站网页
  • 十大摄影网站排名系统优化的方法
  • 企业查询软件免费seo优化技术排名
  • 跨境电商网站建设雅诗兰黛网络营销策划书
  • 微信网站需要一个域名要怎么做内存优化大师
  • 购物网站开发价格百度引擎搜索入口
  • 做精品课程网站需要啥素材游戏代理加盟
  • 网站建设公司优势品牌营销策划案例
  • 开发一个app需要多少资金做关键词优化
  • 动画制作app推荐衡阳seo优化推荐
  • 做网站需要会的软件品牌推广计划书怎么写
  • 自建企业邮箱百度seo优化软件
  • 网站建公司生存企业管理培训
  • 网站托管服务合同范本安徽网络关键词优化
  • 做网站时如何上传图片网络市场营销策划书
  • 重庆网站建设哪家公司那家好中国十大电商平台
  • 网站开发流程 知乎潍坊网站开发公司
  • 做竞价网站 要注意什么seo网站优化软件
  • 百度权重什么意思重庆镇海seo整站优化价格
  • 专做美妆的视频网站推广app下载
  • 做雇主品牌的网站南宁关键词排名公司
  • 微网站用什么做代写文案平台
  • 如何让自己的网站排名靠前怎么做seo关键词优化
  • 天津建设工程信息网专家登录杭州上城区抖音seo如何
  • 网站诚信体制建设百度推广代理怎么加盟