这两天在测试一个程序的时候发现,一旦压力达到一定程度,程序立即就会崩溃,报的错误几乎都在new的时候没有内存了,一开始以为确实是因为内存分配的问题,后来在程序运行过程中用top观察,发现内存使用很低,因此可以确认不应该是瞬间内存使用完造成的。因此认真看了一下core dump的地方,发现几乎都是在自己写的一个智能指针分配内存那里出的问题。于是仔细思考了一下,发现是因为智能指针的引用计数没有加锁导致的。
一开始以为我所使用的智能指针即使是在异步情况下使用的,但是基本上只能同一时间在一个线程持有,但是事实情况却并非如此
如下代码
void func()
{
shared_ptr a;
async_call(a);
}
首先有一个智能指针,接下来,这个智能指针被丢给了异步程序,因此这个时候其实已经有两个线程同时持有这个智能指针了,因为这个函数还未退出,当前线程还拥有临时变量a。一般低压情况下,这两句很快就执行完了,不会出问题,但是高压情况下,这个函数先执行完,还是异步程序先执行完就不一定了(或者说是因为高压情况样本变多了)
结论:多线程异步程序的冲突问题比一般性多线程程序更隐蔽,很难查找,要仔细思考。
分享到:
相关推荐
内容概要:文章内容从原子性、可见性、有序性三个方面介绍C++线程安全问题的原因。通过原子操作、线程同步如互斥锁、读写锁、条件变量、信号量等方法解决C++线程安全问题。同时介绍了线程安全的单例,饿汉模式和懒汉...
多线程与智能指针 C++线程与智能指针 ⽂章⽬录 线程 线程,有时被称为轻量进程,是程序执⾏的最⼩单元。 C++11线程 #include <thread> void task(int i) { cout ; } thread t1(task,100); //等待线程结束再继续执⾏ ...
2、 如果不需要支持多线程,可以在 "shared_ptr.hpp"文件最开始处定义: #define SHARED_PTR_SINGLETHREAD; 3、 在使用前: using namespace YDSH_PTR; 4、 shared_ptr<classtype> p=new(ydsh,(classtype*)0) class...
编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来...本文读者应具有 C++ 多线程编程经验,熟悉互斥器、竞态条件等概念,了解智能指针,知道 Observer 设计模式。
使用技术:遗传算法,引用计数型智能指针,设计模式,多线程 优点:1.采用了智能指针技术(没有使用boost库的引用计数型智能指针,而是参考C++沉思录自己实现的),提高了效率,有利于防止内存泄露。个人也建议在看...
多个智能指针可以指向相同对象,该对象和其相关资源会在"最后⼀个引 ⽤(reference)被销毁"时候释放。为了在结构复杂的情境中执⾏上述⼯作,标准库提供了weak_ptr、bad_weak_ptr和 enable_shared_from_this等辅助类...
cpp八股文,包括但不限于 ...15 c++智能指针多线程下为什么会影响性能? 16 智能指针shared_ptr,线程安全性, 智能指针的线程安全性又如何呢? 17 类似于智能指针的例子在C++中还有别的吗? 18 智能指针的实现。。。
编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来...本文读者应具有 C++ 多线程编程经验,熟悉互斥器、竞态条件等概念,了解智能指针,知道 Observer 设计模式。
这不是智能指针!这是内存集中管理的GC器,基于RAII。AutoGC简单的C++垃圾回收器,基于c++11标准的多线程。这是源码和lib+示例。
此文描述了智能指针unique_ptr的用法的相关介绍,具体实例请看下文 unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误...
安全:即时检测错误情况,并保护您免受未定义的行为的侵害人体工程学:无需手动管理根,只需一个常规的智能指针deref支持: DerefGc会为您提供垃圾回收,并在可能的情况下提供Deref智能指针准备好进行无畏的并发:...
1、第一板块:内存管理: 1、实用动态内存的优势:不同的对象函数之间可以共享使用一个内存区域。... 6、智能指针,shared_ptr内部有引用计数 unique_ptr而没有。通过智能指针实现自动释放内存。 share_pt<
优点简介: 支持超大数据量,面向大型论坛使用者 强大的智能搜索,与指针定位判断搜索,支持海量数据 ...高效的多线程优化算法,让你的论坛在多线程下快速稳定的运转 独有的平面文件数据库稳定性算法
C++之父写的,针对最新C++11,C++14的语言特性概览,涉及最新标准,智能指针,多线程,lambada表达式,move,forward等。
用C语言实现智能指针
原创 静态断言 #include <stdio.h> #include<assert.h> #include<iostream> //断言:迅速找到 using namespace std; #define N 10 voi... 2018-05-16 18:05:42 ...原创 智能指针
Java语言在我们大学学习中占了很大的比重,其优点甚多:面向对象,可靠,安全,多平台可移植,高性能,多线程等。面向对象是相对于c语言的面向过程来说的,在面向对象编程中,我们用Java去新建一个对象,调用其方法...
射箭射箭是一个锈库,它提供了一种对Rc和Arc智能指针进行抽象的方法。 这样,您就可以创建数据结构,其中射箭是射箭库,它是一个锈库,提供了一种通过Rc和Arc智能指针进行抽象的方法。 这使您可以创建指针类型可参数...
安全地图 作者:Karen Pease( ) 许可证:公共领域。 尽你所能! 没有明示或暗示的担保。 介绍 线程对许多现代应用程序至关重要,最新的C ++标准... 这可能很慢,尤其是在需要排序的情况下(映射与哈希)。 使用这种
Java语言在我们大学学习中占了很大的比重,其优点甚多:面向对象,可靠,安全,多平台可移植,高性能,多线程等。面向对象是相对于c语言的面向过程来说的,在面向对象编程中,我们用Java去新建一个对象,调用其方法...