`
javatgo
  • 浏览: 1134958 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

智能指针在多线程情况下的问题

 
阅读更多

这两天在测试一个程序的时候发现,一旦压力达到一定程度,程序立即就会崩溃,报的错误几乎都在new的时候没有内存了,一开始以为确实是因为内存分配的问题,后来在程序运行过程中用top观察,发现内存使用很低,因此可以确认不应该是瞬间内存使用完造成的。因此认真看了一下core dump的地方,发现几乎都是在自己写的一个智能指针分配内存那里出的问题。于是仔细思考了一下,发现是因为智能指针的引用计数没有加锁导致的。


一开始以为我所使用的智能指针即使是在异步情况下使用的,但是基本上只能同一时间在一个线程持有,但是事实情况却并非如此


如下代码


void func()

{

shared_ptr a;

async_call(a);

}


首先有一个智能指针,接下来,这个智能指针被丢给了异步程序,因此这个时候其实已经有两个线程同时持有这个智能指针了,因为这个函数还未退出,当前线程还拥有临时变量a。一般低压情况下,这两句很快就执行完了,不会出问题,但是高压情况下,这个函数先执行完,还是异步程序先执行完就不一定了(或者说是因为高压情况样本变多了)


结论:多线程异步程序的冲突问题比一般性多线程程序更隐蔽,很难查找,要仔细思考。
分享到:
评论

相关推荐

    C++线程安全问题及解决方法,C++智能指针

    内容概要:文章内容从原子性、可见性、有序性三个方面介绍C++线程安全问题的原因。通过原子操作、线程同步如互斥锁、读写锁、条件变量、信号量等方法解决C++线程安全问题。同时介绍了线程安全的单例,饿汉模式和懒汉...

    多线程与智能指针.pdf

    多线程与智能指针 C++线程与智能指针 ⽂章⽬录 线程 线程,有时被称为轻量进程,是程序执⾏的最⼩单元。 C++11线程 #include <thread> void task(int i) { cout ; } thread t1(task,100); //等待线程结束再继续执⾏ ...

    C++ 解环引用智能指针

    2、 如果不需要支持多线程,可以在 "shared_ptr.hpp"文件最开始处定义: #define SHARED_PTR_SINGLETHREAD; 3、 在使用前: using namespace YDSH_PTR; 4、 shared_ptr<classtype> p=new(ydsh,(classtype*)0) class...

    自写数据库连接池,基于C++11、MySQL、智能指针、多线程、生产者-消费者模式.zip

    C++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...

    当析构函数遇到多线程── C++ 中线程安全的对象回调

    编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来...本文读者应具有 C++ 多线程编程经验,熟悉互斥器、竞态条件等概念,了解智能指针,知道 Observer 设计模式。

    基于遗传算法的排课系统,含论文(排课 遗传算法 设计模式 智能指针 报表)

    使用技术:遗传算法,引用计数型智能指针,设计模式,多线程 优点:1.采用了智能指针技术(没有使用boost库的引用计数型智能指针,而是参考C++沉思录自己实现的),提高了效率,有利于防止内存泄露。个人也建议在看...

    C++智能指针shared-ptr讲解与使用.pdf

    多个智能指针可以指向相同对象,该对象和其相关资源会在"最后⼀个引 ⽤(reference)被销毁"时候释放。为了在结构复杂的情境中执⾏上述⼯作,标准库提供了weak_ptr、bad_weak_ptr和 enable_shared_from_this等辅助类...

    cpp八股文+校招+实习+春招+秋招+大厂面试

    cpp八股文,包括但不限于 ...15 c++智能指针多线程下为什么会影响性能? 16 智能指针shared_ptr,线程安全性, 智能指针的线程安全性又如何呢? 17 类似于智能指针的例子在C++中还有别的吗? 18 智能指针的实现。。。

    当析构函数遇到多线程── C++ 中线程安全的对象回调 PDF

    编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来...本文读者应具有 C++ 多线程编程经验,熟悉互斥器、竞态条件等概念,了解智能指针,知道 Observer 设计模式。

    AutoGC简单的C++垃圾回收器,基于多线程。

    这不是智能指针!这是内存集中管理的GC器,基于RAII。AutoGC简单的C++垃圾回收器,基于c++11标准的多线程。这是源码和lib+示例。

    智能指针unique_ptr的用法

    此文描述了智能指针unique_ptr的用法的相关介绍,具体实例请看下文  unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误...

    shredder:垃圾收集了Rust的智能指针

    安全:即时检测错误情况,并保护您免受未定义的行为的侵害人体工程学:无需手动管理根,只需一个常规的智能指针deref支持: DerefGc会为您提供垃圾回收,并在可能的情况下提供Deref智能指针准备好进行无畏的并发:...

    华飞智能嵌入式软件工程师(带答案)_嵌入式-常用知识&面试题库_大厂面试真题.docx

    8. 嵌入式系统开发面试题库:该文件中的问题涵盖了嵌入式系统开发中的基础知识和高级技术,包括网络编程、多进程和多线程开发、信号量的使用、进程创建方式、C++ 语言基础、内存分配机制等方面。

    Boost库学习指南.pdf

    Boost 库的主要应用领域包括泛型编程、智能指针、多线程编程、正则表达式、数组操作等领域,提供了大量的技术文档和实践示例,帮助开发者快速掌握 Boost 库的使用和编程技术。 在 Boost 库中,智能指针是非常重要...

    C++11内存管理和多线程编程

    1、第一板块:内存管理:  1、实用动态内存的优势:不同的对象函数之间可以共享使用一个内存区域。...  6、智能指针,shared_ptr内部有引用计数 unique_ptr而没有。通过智能指针实现自动释放内存。  share_pt<

    Ofstar v1.3 beta 7

    优点简介: 支持超大数据量,面向大型论坛使用者 强大的智能搜索,与指针定位判断搜索,支持海量数据 ...高效的多线程优化算法,让你的论坛在多线程下快速稳定的运转 独有的平面文件数据库稳定性算法

    C++语言导学

    C++之父写的,针对最新C++11,C++14的语言特性概览,涉及最新标准,智能指针,多线程,lambada表达式,move,forward等。

    使用C语言在多线程环境中使用句柄和侵入式引用计数器

    用C语言实现智能指针

    C 题库汇总 (1).xls

    原创 静态断言 #include <stdio.h> #include<assert.h> #include<iostream> //断言:迅速找到 using namespace std; #define N 10 voi... 2018-05-16 18:05:42 ...原创 智能指针

    c++后台开发总结.docx

    volatile 关键字可以确保编译器生成正确的机器码,使程序在多线程环境下正确地工作。 6. restrict 关键字 restrict 关键字是C++中的一个关键字,用于声明受限指针。受限指针是指针别名,它们指向同一个对象,但有...

Global site tag (gtag.js) - Google Analytics