C/C++编码:无锁编程

1059 篇文章 286 订阅

什么是无锁编程

  • 无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)
  • 实现非阻塞同步的方案称为“无锁编程算法”

为什么要非阻塞同步

使用lock实现线程同步有非常多缺点:

  • 产生竞争时,线程被阻塞等待,无法做到线程实时响应
  • dead lock
  • live lock
  • 优先级反转
  • 使用不当,造成性能下降

假设在不使用 lock 的情况下,实现变量同步,那就会避免非常多问题。尽管眼下来看,无锁编程并不能替代 lock。

实现级别

非同步阻塞的实现分为三个级别:wait-free/lock-free/obstruction-free

wait-free

最理想的模式,整个操作保证每一个线程在有限步骤下完毕

保证系统级吞吐(system-wide throughput)以及无线程饥饿。

截止2011年,没有多少详细的实现。即使实现了,也须要依赖于详细CPU。

lock-free

同意个别线程饥饿,但保证系统级吞吐。

确保至少有一个线程可以继续运行。

wait-free的算法必然也是lock-free的。

obstruction-free

在不论什么时间点,一个线程被隔离为一个事务进行运行(其它线程suspended),而且在有限步骤内完毕。在运行过程中,一旦发现数据被改动(採用时间戳、版本),则回滚。

也叫做乐观锁,即乐观并发控制(OOC)。

事务的过程是:

  • 读取,并写时间戳
  • 准备写入,版本号校验
  • 检验通过则写入,检验不通过,则回滚

lock-free必然是obstruction-free的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值