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