zoukankan      html  css  js  c++  java
  • 无锁内存缓冲池

    /*
                    无锁内存缓冲池
    其特点例如以下:
    池内存的申请和释放不会使用锁,仅仅会用到微耗的interlockedincrement和interlockeddecrement函数
    池内存总大小和池内内存块的大小是固定长度的,通过构造函数的參数指定;
    分配出来的池内存是经过memset确认的物理内存;
    池大小是固定的,若池中空暇内存不足以提供所需,则池内存分配函数利用malloc向系统额外申请,但新申请的内存不并入池中;
    通过GetBuf()和FreeBuf两个函数进程池内存的申请和释放;
    */
    #ifndef HBUFFER_HPP
    #define HBUFFER_HPP
    
    inline void IncPtr(void **p,int i)
    {  
        *p = (void*)((int)*p + i);
    }
    
    class HBuff
    {
    public:
        HBuff(long buf_count,long buf_size)
            :m_buf_count(buf_count),m_buf_size(buf_size)
        {
            m_buf = malloc(buf_count * buf_size);
            memset(m_buf,0,buf_count * buf_size);
            m_buf_end = (unsigned long)m_buf + (buf_count *  buf_size);
            m_buf_free = new void*[buf_count];
            void *p = m_buf;
            for(size_t i=0;i<buf_count;++i)
            {
                m_buf_free[i] = p;
                IncPtr(&p,buf_size);
            }
            m_buf_free_pos = buf_count - 1;       
        }
        ~HBuff()
        {
            ::free(m_buf);
            delete [] m_buf_free;        
        }
        void *GetBuf()
        {
            long i = InterlockedDecrement(&m_buf_free_pos);
            if(i < -1)
            {
                void *ret = malloc(m_buf_size);
                memset(ret,0,m_buf_size);
                return ret;
            }
            else
            {
                return m_buf_free[i+1];
            }
        }
        void FreeBuf(void *buf)
        {
            if((unsigned long)buf >= m_buf_end || (unsigned long)buf < (unsigned long)m_buf)
                ::free(buf);
            else
            {
                long i = InterlockedIncrement(&m_buf_free_pos);
                m_buf_free[i] = buf;            
            }
        }
    private:
        HBuff(const HBuff&);
        HBuff& operator=(const HBuff&);
    private:
        long    m_buf_count;
        long    m_buf_size;
        unsigned long m_buf_end;
        void*   m_buf;
        void**   m_buf_free;
        long volatile m_buf_free_pos;    
    };
    
    #endif

  • 相关阅读:
    mybatis几种开发方式
    SpringData,JPA,MongoDB,Solr,Elasticsearch底层逻辑关系
    简论远程通信(RPC,Webservice,RMI,JMS的区别)
    spring/spring boot/spring mvc中用到的注解
    Centos常用命名
    Mybatis详解
    Java成长之路
    Hibernate 与Mybatis之比较
    Struts2 与SpringMVC之比较
    Maven 配置文件详解
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4224658.html
Copyright © 2011-2022 走看看