add optimistic lock list
parent
ae1e5d0104
commit
b06fa65636
|
@ -0,0 +1,83 @@
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 基于乐观锁的链表
|
||||||
|
*/
|
||||||
|
template <typename T>
|
||||||
|
class LockfreeList
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
std::list<T> list;
|
||||||
|
|
||||||
|
private:
|
||||||
|
int mutex;
|
||||||
|
int lock;
|
||||||
|
int unlock;
|
||||||
|
public:
|
||||||
|
LockfreeList():mutex(0),lock(0),unlock(1){};
|
||||||
|
~LockfreeList(){};
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue