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

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

文件1:lockfree_list.hpp

#ifndef JZ_LOCK_FREE_LIST_HPP
#define JZ_LOCK_FREE_LIST_HPP

#include 

/*
*   说明:基于CAS封装的无锁List。
*/
template 
class JzLockfreeList
{
    private: 
        std::list 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::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


你可能感兴趣的:(c/c++,linux)