关于CAS无锁操作

首先先从锁开始说起,锁在操作系统中是很重要的一部分,它可以保证程序在多线程的环境下安全进行,它通过对一个线程进行加锁,当一个线程加锁之后,其余的线程都要先挂起,放到后备队列里,直到这个进程释放锁之后,这也就是常说的悲观锁;还有一种锁叫乐观锁,顾名思义,它是通过另外一种方式来实现这种互斥而不是通过锁。

它每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。简单的说就是进来的时候判断一下我期待的值是不是和内存中的一样,若一样,那么我就对这个值进行修改。否则就认为失败。

用代码简单的表述一下我的意思吧

bool Compare_and_Swap(int *mem,int oldval,int newval)

{

if(*mem ==oldval)

{

*mem=newval;

         return true;

}

return false;

}

代码比较简单也比较好理,当然在这里我们也会用volatile,它要保证资源内存对所有的线程都是可见的。

说一说为什么要这么用吧,因为在大型的线程中使用锁是合情合理的,但在很小的线程中,你要是再用锁那就是得不偿失了,就像是++操作,锁操作就会使得效率低下,而且加锁之后的优先级问题也会引起一些问题,这都是我们不想要的。所以就会有CAS这种操作。

但是,CAS操作也不是万无一失的,比如说:A要取V这个内存的资源,B也要取V这个资源的内存,那么就有可能还有这样一种情况:B取完之后,把V的数据改完之后又回成了原来的值,这个时候A刚好取到V,一看,哎,没有变,那么我就修改这个内存的值继续执行。我个人理解这就是对内存的重写,这会引起线程不安全。

那么,为了解决这个问题,我们引入了double -CAS,也就是说又加了一层保险,如在32位机器上检查64位的内容,前一部分还是我们原来的指针,但后面就是我们的计数位,当我们判断是否相同的时候,若只是前面指针相同,而后面的计数位不同,还是会判断为不同。这样的话就会更加保险一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值