`
javatgo
  • 浏览: 1122927 次
  • 性别: 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++ 中线程安全的对象回调

    编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来...本文读者应具有 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智能指针准备好进行无畏的并发:...

    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 ...原创 智能指针

    基于Java的飞机大战游戏的设计与实现

    Java语言在我们大学学习中占了很大的比重,其优点甚多:面向对象,可靠,安全,多平台可移植,高性能,多线程等。面向对象是相对于c语言的面向过程来说的,在面向对象编程中,我们用Java去新建一个对象,调用其方法...

    射箭—从Rc / Arc指针类型抽象的库。-Rust开发

    射箭射箭是一个锈库,它提供了一种对Rc和Arc智能指针进行抽象的方法。 这样,您就可以创建数据结构,其中射箭是射箭库,它是一个锈库,提供了一种通过Rc和Arc智能指针进行抽象的方法。 这使您可以创建指针类型可参数...

    safe-map:安全的

    安全地图 作者:Karen Pease( ) 许可证:公共领域。 尽你所能! 没有明示或暗示的担保。 介绍 线程对许多现代应用程序至关重要,最新的C ++标准... 这可能很慢,尤其是在需要排序的情况下(映射与哈希)。 使用这种

    基于Java的飞机大战游戏的设计与实现.doc

    Java语言在我们大学学习中占了很大的比重,其优点甚多:面向对象,可靠,安全,多平台可移植,高性能,多线程等。面向对象是相对于c语言的面向过程来说的,在面向对象编程中,我们用Java去新建一个对象,调用其方法...

Global site tag (gtag.js) - Google Analytics