lock-free和wait-free的讨论

https://www.zhihu.com/question/295904223/answer/514363565

一种是我们程序员口头常说的lock free ,指的是只要程序中不去请求和释放mutex/lock,你就可以说你的程序是lock free的。我觉得程序员之间一般口头上不会说我的程序是wait-free的,wait-free并不是程序员用于沟通的常用概念,我们可能更愿意说CAS或者乐观锁来表达类似的概念。

还有一种是比较学术的我们界定并发算法或者系统的lock free/wait free。

我盗个图

这里有原文 concurrencyfreaks.blogspot.com

这时lock free意味着,当你有很多线程的时候,尽管可能有一些线程是“饿”着的,但总体的吞吐量是能得到保证的--通俗的说,假如你是个线程,虽然可能一时轮不到你,但是你也不阻碍别人。而且如果执行的时间够长,那些“饿”着的线程早晚也会完成自己的任务。上面原文说“A method is Lock-Free if it guarantees that infinitely often some thread calling this method finishes in a finite number of steps.” 就是说除了极少极少可能发生的个别的倒霉蛋,非常非常多的线程还是在有限步内完成了任务,从而保证了系统的吞吐量和平均延时,实际的例子就是用一个循环CAS来修改数据。

wait-free就更强一点,它保证任何线程都能在“有限”的步骤中取得进展--我们就说是把事情搞定吧。基本的使用CAS做循环重试的算法设计不符合wait-free,因为我们有些倒霉的线程理论上有一定概率一直等在那里,得不到执行。wait free是非常难做的,我们以前一直看不到什么wait free的数据结构和算法,直到这里有个wait - free 队列的实现,是2011年才搞出来的。 虽然这个算法也是利用cas,但它为每一个要发生的操作提供了一个state array,而且为每个操作都赋予了一个number,这样保证了可以在有限步完成入队和出队的操作。这里有这篇论文的pdf全文,写的还挺好懂的。 cs.technion.ac.il/~erez

而且wait free 这个有限也可能是一个很大的数。其实在实时性要求更高的系统中,我们需要更高保证的wait free,其实就是为有限步数加个上界,这个就叫“Wait-Free Bounded”,简称WFB,具体可以看上面的那个原文链接。

另外现有的wait-free和wfb算法 ,往往是和你有多少线程相关的。比如说你有10个线程,可能最多只要等100步,但是如果你有1000个线程,可能就要最多等10000步了。这时就有了个新的概念Wait-Free Population Oblivious, 他可以保证你算法的最大完成步数的有限bound是和active的线程数是无关的。显然符合Wait-Free Population Oblivious的算法,必然也是Wait-Free Bounded的。想原文中也举了c++11中atomic的fetch_add的例子,这个例子还是应该看指令集和编译器,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值