这两天在测试一个程序的时候发现,一旦压力达到一定程度,程序立即就会崩溃,报的错误几乎都在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++是一种面向对象的计算机程序设计语言,由美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普博士在20世纪80年代初期发明并实现(最初这种语言被称作“C with Classes”带类的C)。它是一种静态数据类型检查的、支持多重...
编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有的互斥器来...本文读者应具有 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智能指针准备好进行无畏的并发:...
8. 嵌入式系统开发面试题库:该文件中的问题涵盖了嵌入式系统开发中的基础知识和高级技术,包括网络编程、多进程和多线程开发、信号量的使用、进程创建方式、C++ 语言基础、内存分配机制等方面。
Boost 库的主要应用领域包括泛型编程、智能指针、多线程编程、正则表达式、数组操作等领域,提供了大量的技术文档和实践示例,帮助开发者快速掌握 Boost 库的使用和编程技术。 在 Boost 库中,智能指针是非常重要...
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 ...原创 智能指针
volatile 关键字可以确保编译器生成正确的机器码,使程序在多线程环境下正确地工作。 6. restrict 关键字 restrict 关键字是C++中的一个关键字,用于声明受限指针。受限指针是指针别名,它们指向同一个对象,但有...