开发者社区> horky> 正文

[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对对象所有权更完整的解释



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
iOS开发中 关于阿里云服务器的使用与安全策略 韩俊强的博客
使用背景:         云服务已经很多年了,早期没能加入使用云大军中的一员,后来后悔莫及。2015年记得当时没办法租用的虚拟主机三天两天挂了,导致我认认真真的考虑了一次,觉得还是要使用云服务器! 从免费的主机屋学习版到各种虚拟机的实验,再到之前是用300元左右买的别人的虚拟主机,空间有几G,感觉还行,正好又值他们搞活动,买两年送一年!预存还有返还!心动了,就没有任何考虑就预存了一千块! 开始的几个月感觉还行,速度什么的还过得去,就没去管网站的事了。
1674 0
[Chromium]如何安全的使用PostTask
PostTask参数决策树 如何传递绑定的对象 官方的解释总是最权威,有疑问看这里或者直接看代码中的说明: bind_helpers.h.  传值方式 描述 this 或 对象指针 如果对象本身是一个RefCountedThread...
1265 0
easy-task基础入门使用说明
easy-task基础入门使用说明
20 0
使用企业安全组导致自建SNAT网关网络不通
使用企业安全组导致自建SNAT网关网络不通
221 0
+关注
horky
Web及移动开发技术
294
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载