chromium的线程与任务

  • 物理线程(Thread):操作系统提供的线程,可以使用base::Thread创建,但是没必要创建,chromium提供UI线程,IO线程,线程池等。

  • 虚拟线程(Sequence):由于Chrome维护的虚拟线程。

区别

  • 两个task先后Post到同一个Thread上,那么这两个task一定会在同一个物理线程上,以post的顺序先后执行。

  • 两个task先后Post到同一个Sequence上,那么这两个task可能会在同一条物理线程上执行,也可能在不同的物理线程执行,但是执行顺序一定跟post顺序一致的。

如果不是跟UI相关,尽量使用Sequence,比如去后台Load一个大文件

class MyView {
public:
  MyView() {
    //创建Squence
    task_runner_ = ...;

    //将sequence_checker_与当前Sequence脱离绑定
    DETACH_FROM_SEQUENCE(sequence_checker_);
  }

  void Load() {
    //Post到task_runner_ Squence中执行
    task_runner_->PostTask(FROM_HERE,
      base::BindOnce(&MyView::LoadImpl, base::Unretained(this)));
  }

private:
  void LoadImpl() {
    //检查是不是在task_runner_ Squence调用
    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
    //加载
    Data data = ...;
    //Post到UI线程
    base::PostTask(FROM_HERE, {content::BrowserThread::UI}, 
      base::BindOnce(&MyView::LoadComplete, base::Unretained(this), std::move(data)));
  }

  void LoadComplete(Data data) {
    //检查是不是在UI线程中调用
    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  }

private:
  scoped_refptr<SequencedTaskRunner> task_runner_;
  SEQUENCE_CHECKER(sequence_checker_);
};

SEQUENCE_CHECKER/DCHECK_CALLED_ON_VALID_SEQUENCE使用来检查函数有没有在指定的Squence中运行的。
如果需要检查有没有在指定的线程运行,可以用THREAD_CHECKER/DCHECK_CALLED_ON_VALID_THREAD

THREAD_CHECKER(thread_checker_);
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值