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这个个东西

转载于:https://www.cnblogs.com/limedia/p/licode_erizo_ioworker.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值