内存管理一直是一个比较头疼的问题,直到发现 atomic变量
问题是这样的,咱们须要这样一个程序,开启以后,不停地从相机获取图像,并进行实时地分析,这个分析是由多个插件独立地在各自线程完成,因为相机地帧率很高,因此若是不优化内存管理方法,一旦有内存泄露,就会快速形成内存不足。git
以前采起的措施是每次获取到图片,都将其进行内存拷贝到图像分析线程,分析线程完成分析以后释放各自地内存。这种方法确实是可行的,运行一段时间发现也是稳定的,可是开销确实太大,不管是内存反复拷贝须要的时间开销仍是内存多份拷贝带来的空间开销,都是不容忽视的问题。github
在稍微阅读了LevelDB的源代码以后,了解到了atomic
变量,因而用这个技术从新实现了一个自动化的内存管理。这个管理方法是基于引用计数的,可是针对咱们本身的需求进行了一点优化。数据结构
在咱们这个程序中,内存是经由单生产者生产,多消费者处理,而且最重要的是这个消费者的数量是能够事先知道的,每一个处理模块都是一个单独的插件,因此加载完插件以后就能知道一共有多少个消费者,每一个消费者都须要对每张图片进行处理,当且仅当全部的消费者对某个图片都处理完成以后,那张图片才能被释放。函数
使用以下的数据结构fetch
class Buffer { std::atomic_int m_refCount; void *m_buffer; public: Buffer(void *data,const uint &count):m_refCount(count),m_buffer(data){} void *getBuffer(){return m_buffer;} void deRef(){ if(m_refCount.fetch_sub(1,std::memory_order_relaxed)<=1){ free(m_buffer);delete this; } } };
构造这个Buffer
时,将消费者数量传进去,每一个消费者处理完成以后,都会调用deRef
函数,当全部消费者都完成处理以后,内存将会被释放。这种方法能避免内存的反复拷贝,极大地节省了空间和时间。优化