通过与 Jira 对比,让您更全面了解 PingCode

  • 首页
  • 需求与产品管理
  • 项目管理
  • 测试与缺陷管理
  • 知识管理
  • 效能度量
        • 更多产品

          客户为中心的产品管理工具

          专业的软件研发项目管理工具

          简单易用的团队知识库管理

          可量化的研发效能度量工具

          测试用例维护与计划执行

          以团队为中心的协作沟通

          研发工作流自动化工具

          账号认证与安全管理工具

          Why PingCode
          为什么选择 PingCode ?

          6000+企业信赖之选,为研发团队降本增效

        • 行业解决方案
          先进制造(即将上线)
        • 解决方案1
        • 解决方案2
  • Jira替代方案

25人以下免费

目录

wait-free是指什么

wait-free是指指一个线程能够在有限步内make progress。对于一个算法,Obstruction-freedom(无障碍)/Lock-freedom(无锁)/Wait-freedom(无等待),从弱到强描述了在并发环境下线程的演进保证(guarantee of progress)这个属性。

一、wait-free是指什么

wait-free是指指一个线程能够在有限步内make progress。对于一个算法,Obstruction-freedom(无障碍)/Lock-freedom(无锁)/Wait-freedom(无等待),从弱到强描述了在并发环境下线程的演进保证(guarantee of progress)这个属性。换句话说,它描述了线程随着指令序列的执行取得进展(make progress)的能力。

而lock-free的意思就是:只要有task在往前走(make progress),那总有task能往前走;wait-free的意思是,只要某个task活着,不管别人在干什么,它都一定能往前走。

为什么有lock就不是lock-free了,因为只要拿到lock的那个task挂掉不动了,这个系统就完蛋了,每个task都不能再往前走了。

Lock-free和wait-free的区别在哪,在于starvation。大部分的lock-free的算法都是基于某些竞争性的原语的(primitives)。Starvation一般都是在有多个task竞争(race)的时候,也许有一个运气好的task总是在赢,那么别的task就很可怜地什么都做不了了。这不是因为没轮到他们,而只是因为他们运气坏。实际上整个系统还是在运行的,就是那个运气好的task自己一直在跑,所以这不是死锁(dead-lock)。有人把这个东西定义为live-lock,这也没法翻译了(总不能真翻成活锁吧)。

很少有天然的wait-free的算法(最天然的那个,single-reader-single-writer queue大家都知道了)。新的wait-free的算法,大都是靠胜者的施舍,也就是说有task一直赢的话,就分给输家一点,让输家能往前动一下。

延伸阅读:

二、从底层去看lock-free

lock-free是一个非常底层的东西,lock-free编程需要atomic指令这个指令是cpu提供的,cpu原生的指令有非常多都是atomic的,这些指令集分为2大类,分别是store-and-load 和read-modify-write

store-and-load

这些指令用于读,写数据到内存中,许多的cpu架构都保证这些操作是原子的,比如mov

read-modify-write

有一些操作需要多个指令比如要对内存中的一个数据进行+1,这至少需要三个原子操作指令,虽然说这3个原子操作是原子的,但是加一起就不是原子的了read-modify-write就是file the gap,在一个原子操作下去执行多个操作,比如test-and-set :将1写入到内存的地址中,然后返回旧的值,fetch-and-add:在内存中的值加上一个数字,然后返回老的值。

相关文章