使用CAS操作实现的无锁栈

本文探讨了使用CAS(Compare And Swap)操作实现无锁栈的概念,指出C++11中提供的五种原子操作,包括两种CAS操作。尽管CAS能保证单步原子性,但无法确保整个函数的原子性,可能导致错误执行,如栈内数据错误判断和并发删除问题。文章提到,面对这些问题,自旋锁+yield有时可能是更好的选择,因为它在效率上接近无锁编程,同时避免了上述问题。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值