当前位置: 首页 > wzjs >正文

win7电脑做网站主机2023年国家免费技能培训

win7电脑做网站主机,2023年国家免费技能培训,广州网站建设阿里云,网站开发导向图在 Chromium 的多线程异步编程中&#xff0c;合理管理对象生命周期非常关键。本文深入介绍 base::RefCountedThreadSafe 和 base::WeakPtr 的组合使用方法&#xff0c;并通过示例分析其使用要点及易踩的坑。 &#x1f331; 基础概念回顾 1. RefCountedThreadSafe<T> 是 …

在 Chromium 的多线程异步编程中,合理管理对象生命周期非常关键。本文深入介绍 base::RefCountedThreadSafebase::WeakPtr 的组合使用方法,并通过示例分析其使用要点及易踩的坑。


🌱 基础概念回顾

1. RefCountedThreadSafe<T>

  • 是 Chromium 中线程安全的引用计数基类,用于实现对象的自动释放。

  • 常和 scoped_refptr<T> 配合使用,确保对象在所有引用释放后自动析构。

  • 使用方式:

    class MyObject : public base::RefCountedThreadSafe<MyObject> { public: void DoSomething(); private: friend class base::RefCountedThreadSafe<MyObject>; ~MyObject(); // 析构必须是 private 或 protected };

2. WrapRefCounted

  • 用于在已有裸指针(如 this)的场景下安全构造 scoped_refptr

    scoped_refptr<MyObject> ptr = base::WrapRefCounted(this);


🧪 示例代码:结合 RefCountedThreadSafe 与异步调用

class MyTaskRunner : public base::RefCountedThreadSafe<MyTaskRunner> { public: void PostWork() { base::ThreadPool::PostTask( FROM_HERE, base::BindOnce(&MyTaskRunner::DoWork, base::WrapRefCounted(this))); } private: friend class base::RefCountedThreadSafe<MyTaskRunner>; ~MyTaskRunner() = default; void DoWork() { LOG(INFO) << "Work done!"; } };

✅ 这里通过 WrapRefCounted(this) 绑定异步任务,确保任务执行时对象仍然存活。


⚠️ 易错用法及反例

❌ 错误示例 1:异步任务绑定裸指针,导致 use-after-free

// 错误:this 可能在异步任务执行前就被释放 base::ThreadPool::PostTask( FROM_HERE, base::BindOnce(&MyTaskRunner::DoWork, this));

❌ 错误示例 2:RefCounted 派生类析构函数为 public

class Wrong : public base::RefCountedThreadSafe<Wrong> { public: ~Wrong() {} // ⚠️ 应为 private,否则会导致外部手动 delete,破坏计数机制 };

❌ 错误示例 3:跨线程误用 WeakPtr

base::WeakPtr<MyObject> weak_ptr = weak_factory_.GetWeakPtr(); // 另一线程中使用 weak_ptr -> 不安全!


🔄 RefCounted 与 WeakPtr 的配合使用

当你希望:

  • 对象生命周期由引用计数管理(如模块长时间存在)

  • 同时避免回调访问已经销毁的对象

你可以使用 RefCounted + WeakPtr 同时配合:

class MyService : public base::RefCountedThreadSafe<MyService> { public: MyService() : weak_factory_(this) {} void StartAsyncTask() { base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::BindOnce([](base::WeakPtr<MyService> weak_self) { if (!weak_self || weak_self.WasInvalidated()) return; weak_self->DoSomething(); }, weak_factory_.GetWeakPtr()), base::Seconds(3)); } private: friend class base::RefCountedThreadSafe<MyService>; ~MyService() = default; void DoSomething() { LOG(INFO) << "Safe async work"; } base::WeakPtrFactory<MyService> weak_factory_; };


✅ 推荐使用模式

场景推荐方案
异步回调确保对象存活WrapRefCounted(this)
回调中避免悬挂指针WeakPtr + WasInvalidated() 检查
复杂模块管理生命周期RefCountedThreadSafe + WeakPtrFactory


🧷 调试技巧与源码入口

常见断点位置

# RefCounted 增减引用 break base::internal::RefCountedThreadSafeBase::AddRef break base::internal::RefCountedThreadSafeBase::Release

Chromium 源码路径

  • base/memory/ref_counted.h

  • base/memory/weak_ptr.h

  • 异步任务绑定:base/bind.h, base/task/post_task.h


📌 小结

  • RefCountedThreadSafe 用于自动管理对象生命周期,避免显式 delete。

  • WeakPtr 可防止异步访问已销毁对象,但不能延长生命周期。

  • WrapRefCounted(this) 是在 this 已构造完毕后引入 scoped_refptr 的安全方式。

  • 多线程/异步任务中合理组合这两者,是写好浏览器模块的重要实践技能。

http://www.dtcms.com/wzjs/313100.html

相关文章:

  • 网站建设2017国内排行网络推广招聘
  • 做qq头像的网站有哪些如何建网站教程
  • 合肥做检查军大网站网站seo诊断分析报告
  • seo计费系统oemseo网站推广专员招聘
  • 深圳做网站推广软文代写价格
  • 电子商务+网站建设网站收录提交工具
  • 网站首页url是什么武汉网站优化
  • 网站建设的专业知识谷歌商店app下载
  • 如何做品牌网站设计百度灰色词排名代发
  • 无锡自助做网站360免费建站网页链接
  • php网站建设与维护合肥网站建设公司
  • 如何做双版网站网站建设费用明细表
  • 制作企业网站的基本步骤济南seo整站优化招商电话
  • 网站建设策目标seo网站关键词排名优化
  • 网站建设及优化 赣icp免费发链接的网站
  • 可以做电商题目的网站惠城网站设计
  • 石家庄市和城乡建设局网站net的网站建设
  • wordpress直达链接厦门seo培训
  • 做赌博我网站找第三方支付微博今日热搜榜
  • 承接网站建设广告语百度seo收费
  • 为新创业公司建设网站关键词自动优化
  • 医院网站建设申请合肥百度快速排名优化
  • 做网站找个人还是公司站长素材音效
  • 做网站要用身份证么竞价恶意点击犯法吗
  • 加强政府网站建设与管理抖音优化是什么意思
  • 泰兴做网站的公司51网站统计
  • 做ppt赚钱网站建设网站制作
  • 想在网站卖房怎么做站长工具爱情岛
  • 在国外做网站赌博犯法吗跨国网站浏览器
  • 市场营销课程成都高新seo