在做高吞吐量的项目中,性能是必须考虑的一个重要因素。而数据同步则又是重中之重,常常需要使用到锁,但是锁的使用会造成性能下降。这个时候,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