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

本文介绍了在高吞吐量项目中,为提高性能,使用CAS原子操作实现基于STL list的无锁list封装。通过实验对比,展示了无锁list在插入和取出1000000个元素时相比于使用mutex锁的性能优势。

272

被折叠的 条评论
为什么被折叠?



