无锁内存缓冲池

/*
                无锁内存缓冲池
其特点如下:
池内存的申请和释放不会使用锁,只会用到微耗的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

时间: 2024-10-09 13:18:29

无锁内存缓冲池的相关文章

boost 无锁队列

一哥们翻译的boost的无锁队列的官方文档 原文地址:http://blog.csdn.net/great3779/article/details/8765103 Boost_1_53_0终于迎来了久违的Boost.Lockfree模块,本着学习的心态,将其翻译如下.(原文地址:http://www.boost.org/doc/libs/1_53_0/doc/html/lockfree.html) Chapter 17. Boost.Lockfree 第17章.Boost.Lockfree Ta

Nah Lock: 一个无锁的内存分配器

概述 我实现了两个完全无锁的内存分配器:_nalloc 和 nalloc.  我用benchmark工具对它们进行了一组综合性测试,并比较了它们的指标值. 与libc(glibc malloc)相比,第一个分配器测试结果很差,但是我从中学到了很多东西,然后我实现了第二个无锁分配器,随着核数增加至30,测试结果线性提高.核数增加至60,测试结果次线性提高,但是仅比tcmalloc好一点. 想要安装,输入命令: git clone ~apodolsk/repo/nalloc,阅读 README文档.

无锁编程

无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization). 实现非阻塞同步的方案称为"无锁编程算法"( Non-blocking algorithm). 多线程编程条件下,多个线程需要对同一共享变量写操作时,一般使用互斥锁来解决竞争问题,如下: 1 extern int g_var; 2 3 mutex_lock; 4 g_var ++; 5 mutex_unloc

Compare And Swap(CAS)实现无锁多生产者

1.CAS 原理 compare and swap,解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数--内存位置(V).预期原值(A)和新值(B).如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值.否则,处理器不做任何操作.无论哪种情况,它都会在CAS指令之前返回该位置的值.CAS有效地说明了"我认为位置V应该包含值A:如果包含该值,则将B放到这个位置:否则,不要更改该位置,只告诉我这个位置现在的值即可. 当同时存在读写线程时,默认情况下是不保证线

基于循环数组的无锁队列

在之前的两篇博客(线程安全的无锁RingBuffer的实现,多个写线程一个读线程的无锁队列实现)中,分别写了在只有一个读线程.一个写线程的情况下,以及只有一个写线程.两个读线程的情况下,不采用加锁技术,甚至原子运算的循环队列的实现.但是,在其他的情况下,我们也需要尽可能高效的线程安全的队列的实现.本文实现了一种基于循环数组和原子运算的无锁队列.采用原子运算(compare and swap)而不是加锁同步,可以很大的提高运行效率.之所以用循环数组,是因为这样在使用过程中不需要反复开辟内存空间,可

无锁编程:lock-free原理;CAS;ABA问题

转自:http://blog.csdn.net/kangroger/article/details/47867269 定义 无锁编程是指在不使用锁的情况下,在多线程环境下实现多变量的同步.即在没有线程阻塞的情况下实现同步.这样可以避免竞态.死锁等问题. 原理 CAS是指Compare-and-swap或Compare-and-Set CAS是一个原子操作,用于多线程环境下的同步.它比较内存中的内容和给定的值,只有当两者相同时(说明其未被修改),才会修改内存中的内容. 实现如下: int comp

谈谈存储软件的无锁设计

面向磁盘设计的存储软件不需要考虑竞争锁带来的性能影响.磁盘存储软件的性能瓶颈点在于磁盘,磁盘抖动会引入极大的性能损耗.因此,传统存储软件的设计不会特别在意处理器的使用效率.曾经对一个存储虚拟化软件进行性能调优,在锁竞争方面做了大量优化,最后也没有达到性能提升的效果,原因就在于存储虚拟化的性能瓶颈点在于磁盘,而不在于处理器的使用效率.正因为如此,在面向磁盘设计的软件中,很多都采用单线程.单队列处理的方式,一定程度上还可以避免由于并发所引入的磁盘抖动问题. 在面向NVMe SSD设计的存储软件中,这

环形无锁队列

环形无锁队列 Table of Contents 1 环形无锁队列的实现 2 死锁及饥饿 3 一些优化 1 环形无锁队列的实现 数据结构定义: template class LockFreeQueue { private: ElementT *mArray; int mCapacity; int mFront; int mTail; } 由于出队操作是在队首进行,入队操作是在队尾进行,因此,我们可以尝试用mFront和mTail来实现多个线程之间的协调.这其中会用到CAS操作: 入队操作伪码:

无锁数据结构(Lock-Free Data Structures)

原文:无锁数据结构(Lock-Free Data Structures) 一个星期前,我写了关于SQL Server里闩锁(Latches)和自旋锁(Spinlocks)的文章.2个同步原语(synchronization primitives)是用来保护SQL Server里的共享数据结构,例如缓存池里的页(通过闩锁(Latches)),锁管理器哈希表里的锁(通过自旋锁(Spinlock)).接下里你会看到越来越多的全新同步原语(synchronization primitives),即所谓的