使用atomic變量進行內存管理

內存管理一直是一個比較頭疼的問題,直到發現 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函數,當全部消費者都完成處理以後,內存將會被釋放。這種方法能避免內存的反覆拷貝,極大地節省了空間和時間。優化

相關文章
相關標籤/搜索