什么是无锁编程

  • 无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(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的。

C/C++编码:无锁编程相关推荐

  1. 【翻译】RUST无锁编程

    本文内容译自Lock-freedom without garbage collection,中间有少量自己的修改. 人们普遍认为,垃圾收集的一个优点是易于构建高性能的无锁数据结构.对这些数据结构进行手 ...

  2. 【C++】多线程与原子操作和无锁编程【五】

    [C++]多线程与原子操作和无锁编程[五] 1.何为原子操作 前面介绍了多线程间是通过互斥锁与条件变量来保证共享数据的同步的,互斥锁主要是针对过程加锁来实现对共享资源的排他性访问.很多时候,对共享资源 ...

  3. 我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程

    在并行编程中,经常会遇到多线程间操作共享集合的问题,很多时候大家都很难逃避这个问题做到一种无锁编程状态,你也知道一旦给共享集合套上lock之后,并发和伸缩能力往往会造成很大影响,这篇就来谈谈如何尽可能 ...

  4. 帖子如何实现显示浏览次数_我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程...

    在并行编程中,经常会遇到多线程间操作共享集合的问题,很多时候大家都很难逃避这个问题做到一种无锁编程状态,你也知道一旦给共享集合套上lock之后,并发和伸缩能力往往会造成很大影响,这篇就来谈谈如何尽可能 ...

  5. 浅谈Linux内核无锁编程原理

    非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking ...

  6. 无锁编程与有锁编程的效率总结、无锁队列的实现(c语言)

    1.无锁编程与有锁编程的效率 无锁编程,即通过CAS原子操作去控制线程的同步.如果你还不知道什么使CAS原子操作,建议先去查看相关资料,这一方面的资料网络上有很多. CAS实现的是硬件级的互斥,在线程 ...

  7. 【算法】CAS的实现和无锁编程

    CAS(Compare and swap,比较与交换) 是一种有名的无锁算法.比较与交换,先比较,发现与预期一致,说明没有其他线程改动过,于是再交换.如果与预期不一致说明改动过,就再来一次. 与各类锁 ...

  8. Cpp / 无锁编程

    无锁编程,就是编译器不再使用系统中关于锁的 API,而是直接通过使用缓存一致性等算法达到锁的目的的一种编程. 可以使用 std::atomic<T> 系列和 __sync_val_comp ...

  9. 无锁编程(Lock Free)框架 系列文章

    无锁编程(Lock Free)框架 系列文章: 1 前置知识:伪共享 原理 & 实战 2 disruptor 使用和原理 图解 3 akka 使用和原理 图解 4 camel 使用和 原理 图 ...

  10. 交易系统开发技能及面试之无锁编程(Lock-free)

    目录 概要 Q1 什么是atomic? Q2 alignas 关键字 Q3 C++的内存模型 relaxed ordering, release-acquire ordering, sequentia ...

最新文章

  1. 从docker 中抓取jvm heap 信息, 并且分析
  2. 【BZOJ】3456: 城市规划(多项式求ln)
  3. C# WPF动画——小游戏
  4. 【Oracle】管理还原数据(undo)
  5. Python爬虫入门教程 46-100 Charles抓取手机收音机-手机APP爬虫部分
  6. c语言编译器uwp版,哔哩哔哩UWP最新版下载 - 哔哩哔哩UWP版免费版(32位64位win10)安装下载v1.3.10.0 - QT软件园...
  7. 5028: 小Z的加油店2257: [Jsoi2009]瓶子和燃料
  8. BPE, WordPiece, SentencePiece
  9. php doctrine datetime,php – doctrine和Symfony 2中的DateTime字段
  10. C语言——矩阵计算(转置、加法、减法、数乘、乘法)
  11. 灰色关联分析(系统分析+综合评价)
  12. HTML女朋友生日祝福、老婆生日快乐源代码,可定制照片+音乐+表白话
  13. Web基础与apache讲解
  14. 华中科技大学 计算机 排名,计算机最强14所高校排名,清华第2,浙大第4,南大第6,华科第10...
  15. 电池电芯生产工艺及流程
  16. 第三章 气体探测器----气体漂移、复合、电压电流曲线、电离室、正比计数器、G-M管、四个时间
  17. linux升级安装失败,更新Ubuntu 16.04系统中安装Adobe Flash更新失败的解决
  18. Linux查ip查不到(Centos8)
  19. java计算机毕业设计小说阅读网站系统源码+系统+数据库+lw文档+mybatis+运行部署
  20. 复数的实部虚部与幅值相角之间的转换及python代码实现

热门文章

  1. 音视频开发系列(3)音频编解码的原理
  2. linux13:(1.0k)ISO映像文件,镜像文件
  3. 我的世界java太卡了怎么办_我的世界服务器太卡怎么办 MC服务器优化攻略
  4. 一个MOC3061的可控硅触发电路的分析
  5. 《信号与系统》解读 第3章 强大的傅里叶时域频域分析工具-1:深入理解信号的时域与频域,需要从熟悉的声音信号入手
  6. 计算机容量单位换算题,计算机储存容量计算单位换算
  7. Amplify Shader Editor手册
  8. python信息技术答案_高中信息技术《Python语言》模块试卷习题.doc
  9. C#Winform拓展控件之Panel
  10. 按条件爬取百度百科词条及其相关词条的ID