zoukankan      html  css  js  c++  java
  • licode学习之erizo篇--IOWorker

    erizo使用IOWorker进行ICE,DTLS的状态交互处理。

    头文件

     1 class IOWorker : public std::enable_shared_from_this<IOWorker> {
     2  public:
     3   typedef std::function<void()> Task;
     4   IOWorker();
     5   ~IOWorker();
     6 
     7   virtual void start();
     8   virtual void start(std::shared_ptr<std::promise<void>> start_promise);
     9   virtual void close();
    10 
    11   virtual void task(Task f);
    12 
    13  private:
    14   std::atomic<bool> started_;
    15   std::atomic<bool> closed_;
    16   std::unique_ptr<std::thread> thread_;
    17   std::vector<Task> tasks_;
    18   mutable std::mutex task_mutex_;
    19 };

    接口定义与Worker基本没有区别,但是内部使用了atomic变量,而没有使用boost的io service,说明线程的执行是自己控制的,看看具体实现

    主要看线程执行体以及task方法

    void IOWorker::start(std::shared_ptr<std::promise<void>> start_promise) {
      if (started_.exchange(true)) {
        return;
      }
    
      thread_ = std::unique_ptr<std::thread>(new std::thread([this, start_promise] {
        start_promise->set_value();
        while (!closed_) {
          int events;
          struct timeval towait = {0, 100000};
          struct timeval tv;
          int r = NR_async_event_wait2(&events, &towait);
          if (r == R_EOD) {
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
          }
          gettimeofday(&tv, 0);
          NR_async_timer_update_time(&tv);
          std::vector<Task> tasks;
          {
            std::unique_lock<std::mutex> lock(task_mutex_);
            tasks.swap(tasks_);
          }
          for (Task &task : tasks) {
            task();
          }
        }
      }));
    }
    
    void IOWorker::task(Task f) {
      std::unique_lock<std::mutex> lock(task_mutex_);
      tasks_.push_back(f);
    }

    在start里面做了重入检测判断,如果重入,直接返回。

    在线程函数体内部,进行了定时处理,即sleep一段时间,执行所有的task。

    在task函数中,将Task放入vector中,从总体实现上,与worker有很大的区别,但是从使用角度,基本是无差别的。

    搞不清楚为啥弄的风格相差这么多。

    在IOWorker里面,使用效率可能不如Worker的效率高,而且人为的将任务集中执行,可能造成瞬时cpu过高。

    总体上和worker没有差别,感觉应该能够和worker进行合并,不需要IOWorker这个个东西

  • 相关阅读:
    acm的STL容器之vector篇
    服务器远程管理方法及centos该装那个
    VB获取对象成员
    获取搜索引擎关键字建议
    IntelliJ IDEA乱码 问题
    排序算法思想
    ubuntu16 开机启动plank
    fail-fast出识
    html 标签过滤、转译、反转译
    (a ==1 && a== 2 && a==3) 有可能是 true 吗?
  • 原文地址:https://www.cnblogs.com/limedia/p/licode_erizo_ioworker.html
Copyright © 2011-2022 走看看