值得一看
广告
彩虹云商城
广告

热门广告位

C++weak_ptr在多线程环境下使用方法

使用 weak_ptr 时需通过 lock() 获取 shared_ptr 以安全访问对象,lock() 线程安全但返回可能为空,必须检查有效性;多线程中应避免直接修改共享 weak_ptr,建议复制到局部变量后操作,并结合互斥锁保护赋值;典型用于观察者模式,防止循环引用和悬空指针。

c++weak_ptr在多线程环境下使用方法

在多线程环境下使用 std::weak_ptr 时,主要目标是安全地访问共享资源,避免因对象生命周期管理不当导致的崩溃或数据竞争。weak_ptr 本身不能直接访问对象,必须通过 lock() 提升为 std::shared_ptr,这一过程在多线程中需要特别注意。

确保线程安全的对象访问

weak_ptr 的 lock() 操作是线程安全的,多个线程可以同时调用 lock() 来生成 shared_ptr。但要注意,lock() 返回的结果可能为空(原对象已被释放),因此每次使用后都需检查有效性。


– 多个线程可并发调用 weak_ptr::lock()
– lock() 成功返回一个 shared_ptr,延长目标对象生命周期
– 必须判断返回的 shared_ptr 是否非空再进行解引用

示例:

std::weak_ptr<MyClass> wp = global_shared_ptr;
<p>// 线程中
auto sp = wp.lock();
if (sp) {
sp->do_something();  // 安全:对象仍存活
} else {
// 对象已释放,跳过或重试
}

避免竞态条件:提升后操作

将 weak_ptr 提升为 shared_ptr 后,应在当前线程内完成对对象的所有操作。因为一旦退出作用域,其他线程可能释放该对象。

立即学习“C++免费学习笔记(深入)”;


– 提升后的 shared_ptr 保证本线程持有对象,防止中途被销毁
– 不要在 lock() 后长时间等待或执行阻塞操作
– 避免在 lock() 和使用之间插入可能让出 CPU 的操作

正确做法是在 lock() 后立即使用,并尽快完成操作:

auto sp = wp.lock();
if (sp) {
// 尽快完成所有操作
int val = sp->compute_value();
log_result(val);
}

结合互斥锁管理 weak_ptr 赋值

虽然 weak_ptr 的 lock() 是线程安全的,但对其本身的赋值、重置等修改操作不能与其它操作并发。如果多个线程可能重新绑定同一个 weak_ptr 变量,需要用互斥锁保护。

百度文心百中

百度文心百中

百度大模型语义搜索体验中心

百度文心百中23

查看详情
百度文心百中


– 共享的 weak_ptr 实例被多线程修改时需加锁
– 若每个线程持有 weak_ptr 副本,则无需锁
– 推荐方式:尽早复制 weak_ptr 到局部变量,再调用 lock()

示例:

std::shared_ptr<MyClass> get_object() {
std::lock_guard<std::mutex> lk(mutex_);
return wp_.lock();  // 安全读取全局 weak_ptr
}

典型应用场景:观察者模式

weak_ptr 常用于实现线程安全的观察者模式,避免循环引用且允许被观察者随时销毁。


– 观察者列表存储被观察者的 weak_ptr
– 通知前调用 lock() 判断目标是否存活
– 存活则转发事件,否则从列表清理

这种方式允许多个线程注册监听和触发事件,而不会因对象销毁引发悬空指针。

基本上就这些。关键点是:用 lock() 获取临时 shared_ptr,检查是否有效,操作期间自动延长生命周期,避免跨线程修改 weak_ptr 本身。不复杂但容易忽略细节。

相关标签:

c++ 作用域 red 局部变量 循环 指针 线程 多线程 空指针 并发 对象 作用域 事件

大家都在看:

C++内存模型与多线程执行顺序关系
C++在Ubuntu系统下的开发环境安装方法
C++对象成员初始化与内存布局关系
C++编译器和链接器安装配置方法
C++结构体与类方法结合使用策略
温馨提示: 本文最后更新于2025-09-19 16:30:09,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞7赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容