利用CAS实现线程安全的无锁队列

1. 关于CAS等原子操作

在开始说无锁队列之前,我们需要知道一个很重要的技术就是CAS操作——Compare And Set 或是 Compare And Swap,比较并交换是原子操作的一种,可用于在多线程编程中实现不被打断的数据交换操作,从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预知性产生的数据不一致问题。该操作通过将内存中的值与指定值oldval进行比较,当内存中的值与oldval一样时将内存中的值替换为新值newval。 现在几乎所有的CPU指令都支持CAS的原子操作,X86下对应的是 CMPXCHG 汇编指令。有了这个原子操作,我们就可以用其来实现各种无锁(lock free)的数据结构。

这个操作用C语言来描述就是下面这个样子:(代码来自Wikipedia的Compare And Swap词条)意思就是说,看一看内存*reg里的值是不是oldval,如果是的话,则对其赋值newval,但这整个操作是原子的。
(这里返回old_reg_val是为了方便调用者使用)

int compare_and_swap (int* reg, int oldval, int newval)
{
   
   
	int old_reg_val = *reg;
	if (old_reg_val == oldval)
		*reg = newval;
	return old_reg_val;
}

这个操作可以变种为返回bool值的形式,返回 bool值的好处在于,调用者可以知道有没有更新成功,并且可以根据调用结果写出链式表达式

bool compare_and_swap (int* reg, int oldval, int newval)
{
   
   
	if (*reg == oldval) {
   
   
		*reg = newval;
		return true;
	}
	return false;
}


与CAS相似的还有下面的原子操作:

注:在实际的C/C++程序中,CAS的各种实现版本如下:

1)GCC的CAS
GCC4.1+版本中支持CAS的原子操作(完整的原子操作可参看 GCC Atomic Builtins


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值