基于C++ STL利用CAS原子操作封装的无锁list

来源:互联网 发布:python金融实战 编辑:程序博客网 时间:2024/05/20 05:57

在做高吞吐量的项目中,性能是必须考虑的一个重要因素。而数据同步则又是重中之重,常常需要使用到锁,但是锁的使用会造成性能下降。这个时候,CAS就大显身手了,关于CAS,这里就不再多说。直接贴我基于STL list的封装的无锁list,其他容器则类似。

文件1:lockfree_list.hpp

#ifndef JZ_LOCK_FREE_LIST_HPP#define JZ_LOCK_FREE_LIST_HPP#include <list>/**   说明:基于CAS封装的无锁List。*/template <typename T>class JzLockfreeList{    private:         std::list<T> list;            private:        int mutex;        int lock;        int unlock;    public:        JzLockfreeList():mutex(0),lock(0),unlock(1){};        ~JzLockfreeList(){};        void Lock()        {            while( !__sync_bool_compare_and_swap (&mutex,lock, 1) )            {                usleep(100);            }        }        void Unlock()        {            __sync_bool_compare_and_swap (&mutex,unlock, 0) ;        }                void Push(T data)        {            Lock();            list.push_back(data);            Unlock();        }        T Front()        {            Lock();            T data = list.front();            Unlock();            return data;        }                void PopFront()        {            Lock();            list.pop_front();            Unlock();        }        bool IsEmpty()        {            Lock();            if( list.empty() )            {                Unlock();                return true;            }            else            {                Unlock();                return false;            }        }        bool Find(T data)        {            typename std::list<T>::iterator it;            Lock();            for ( it = list.begin(); it != list.end(); ++it)            {                if( *it == data )                {                    Unlock();                    return true;                }            }            Unlock();            return false;        }};#endif


下面是我的测试结果:

插入和取出1000000个元素耗时(us):

CAS                            mutex

503691                       1045527

498933                        956898

484434                        1023751


原创粉丝点击