[Chromium]如何安全的使用PostTask

简介: PostTask参数决策树如何传递绑定的对象官方的解释总是最权威,有疑问看这里或者直接看代码中的说明: bind_helpers.h. 传值方式描述this 或 对象指针如果对象本身是一个RefCountedThread...

PostTask参数决策树



如何传递绑定的对象

官方的解释总是最权威,有疑问看这里或者直接看代码中的说明: bind_helpers.h. 

传值方式 描述
this 或 对象指针

如果对象本身是一个RefCountedThreadSafe, 没有问题.

如果是个裸指针,应当尽量避免,除非你可以保证它的线程安全.

base::Unretained

注意:使用这个的前提是有其它同步机制保障对象的生命周期.

  1. 如果有其它同步机制保障对象的生命周期,可以使用Unretained()传递非引用计数的对象.
  2. 如果是一个非引用计数的对象,可以使用Unretained()封装起来.
base::Owned

如果是临时对象,或者担心任务执行完成后对象可能出现泄露,可以使用Owned, 表示由Task

持有对象的所有权,在结束时析构它.

base::Passed 如果要执行Task需要传入scoped指针,就可以使用它转换,它也可以避免拷贝,而是类似move语义.
base::ConstRef 类似常量引用,不希望bind过程出现拷贝,就可以使用它.
base::IgnoreResult 如果Task要调用的方法带有返回值,而你又不关心返回值就可以使用IgnoreResult来传入对象指针.

 

讨论:为什么要避免引用计数?

如果这样一直将以引用计数来使用对象岂不最为简单,为什么要避免引用计数?

Chromium智能指针指引中的解释:

  • Reference-counted objects make it difficult to understand ownership and destruction order, especially when multiple threads are involved. There is almost always another way to design your object hierarchy to avoid refcounting. Avoiding refcounting in multithreaded situations is usually easier if you restrict each class to operating on just one thread, and use PostTask() and the like to proxy calls to the correct thread. base::Bind(), WeakPtr, and other tools make it possible to automatically cancel calls to such an object when it dies. Note that too much of our existing code uses refcounting, so just because you see existing code doing it does not mean it's the right solution. (Bonus points if you're able to clean up such cases.)

还可以参考: 谨慎使用智能指针

参考

关于Callback和Bind对对象所有权更完整的解释



目录
相关文章
|
4月前
|
Web App开发 JSON 前端开发
30个Chrome 灵魂插件!
30个Chrome 灵魂插件!
|
Web App开发 JavaScript 前端开发
Chromium 最新渲染引擎--RenderingNG
前置知识简讲 浏览器架构 组件结构 代码分析
210 0
|
Web App开发 JavaScript 前端开发
Chrome和Chromium的区别
Chrome和Chromium的区别
670 0
Chrome和Chromium的区别
|
前端开发 API 异构计算
Chromium Viz 浅析 - SkiaRenderer & SkiaOutputSurface
**关于 Viz 的系列文章** [Chromium Viz 浅析 - 介绍篇][1] [Chromium Viz 浅析 - 合成器架构篇][2] ---- Chromium 关于光栅化和合成的一些主要性能优化项目包括 OOPD (Out of Process Display Compositor,进程外 Display 合成器), OOPR (Out of Process R
2277 0
|
Web App开发 vr&ar Android开发
Chromium Viz 浅析 - 合成器架构篇
**关于 Viz 的系列文章** [Chromium Viz 浅析 - 介绍篇][1] ---- ## Mojo 快速入门 因为后面的内容需要读者对 Mojo 有一定了解,如果以前没接触过的话,这部分内容提供了一个快速的入门。 简单的说 Mojo 是一个 Client/Service 的通讯机制,支持跨进程。一个 Mojo 链接建立的过程一般如下: 1. Cli
2798 0
|
异构计算
Chromium Viz 浅析 - 介绍篇
很遗憾 Chromium 的工程师没有写一篇 How Viz Works 的文章来详细解析 Viz 这个重要的模块,能找到的一些相关文档都比较零散,所以我打算自己来写,不过个人研究深度有限,无法包括所有的细节,还请读者见谅。 计划写两到三篇文章,第一篇文章对 Viz 做一个概要的介绍,和它在 Chromium 整个合成器架构里面的角色。因为 Viz 的代码变动很快,所以文章的内容只是针对当前
1706 0