CAS(compare and set),是原子数支持的一种操作,假如我们有一个原子数类,那么他其中的CAS函数大致可以理解为这样
bool compare_and_set(T&a,T&b)
{
if(*this==a)
{
*this=b;
return true;
}
else
{
a=*this;
return false;
}
}
并且可以保证上边这个函数是原子性的,我们可以通过这样一个函数在许多地方代替锁的使用,提高程序的速度,比如下面一个无锁栈。
template<typename T>
struct Node
{
Tvalue;
Node*next;
Node(const T& data):value(data),next(NULL)
{ }
};
template<typename T>
class free_lock_stack
{
private:
atomic<Node<T>*>head;
public:
free_lock_stack():head(NULL)
{ }
void push(const T& data)
{
Node* new_node=new Node(data);
new_node->next=head.load();
while(!head.compare_exchange_weak(new_node->next,new_node))
;
}
T pop()
{
Node*result=head.load();
while(!result&&!head.comp