主要讲的是《Implementing Lock-Free Queues》的论点,具体直接看论文最好。这里总结些要点。

CAS就是Compare And Swap。gcc可以调用:

__sync_bool_compare_and_swap

这段代码讲出无锁的两个关键手段:

EnQueue(x) //进队列

{

//准备新加入的结点数据

q = new record();

q->value = x;

q->next = NULL;

do {

p = tail; //取链表尾指针的快照

} while( CAS(p->next, NULL, q) != TRUE); //如果没有把结点链在尾指针上,再试

CAS(tail, p, q); //置尾结点

}

一个就是CAS,一个就是Retry-Loop。

然后,还有一个ABA问题,就是在被抢占之前和之后数据地址没变,但是数据内容可能变了。解决思路就是加一个额外的状态来记录(也可以用记数)。

一个无锁队列的实现:

#include

#include

#include

class CircleQueue {

public:

CircleQueue(int queue_count) {

this->queue_size_ = queue_count * sizeof(void*) + sizeof(unsigned long*) * ;

this->queue_count_ = queue_count;

shm_ = mmap(NULL, queue_size_, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS , -, );

memset(shm_, , queue_size_);

head_ = (unsigned long*)shm_;

tail_ = (unsigned long*)((char*)shm_ + sizeof(unsigned long));

queue_ = (void**)((char*)shm_ + sizeof(unsigned long) * );

}

~CircleQueue() {

munmap(shm_, queue_size_);

}

int PushOneThread(void* ap) {

if((int)(*head_ - *tail_) >= queue_count_) {

return ;//full

}

queue_[ *head_ % queue_count_ ] = ap;

*head_ = *head_ + ;

return ;

}

bool IsEmpty() {

if(*head_ == *tail_) {

return true;

}

return false;

}

int PopOneThread(void** ap) {

if(*head_ == *tail_) {

return ;

}

if (ap == NULL) {

return -;

}

*ap = *(queue_ + *tail_ % queue_count_);

*tail_ = *tail_ + ;

return ;

}

int PopMultiThread(void** ap, int retry) {

*ap = NULL;

for(int i = ; i < retry; ++i) {

volatile unsigned long tail = *tail_;

if(*head_ == tail) {

return ;

}

int ret = __sync_bool_compare_and_swap(tail_, tail, tail + );

if(ret) {

*ap = *( queue_ + (tail % queue_count_));

return ;

}

}

return -;

}

private:

unsigned long* head_;

unsigned long* tail_;

void** queue_;

void* shm_;

int queue_size_;

int queue_count_;

};

这里的场景主要是一写多读。写的时候操作的是head,不需要加锁。读的时候,tail在改变的时候用上了CAS和retry-loop。 注意这里tail_只有在写的时候改变,而且只会往上加,所以不存在ABA问题。

p.s. 多进程通信的一个关键点,就是在于共享内存的时候,要确保所有的地址都是多进程共享的。所以这里存的指针,如果是多进程环境下,也应该是从共享内存中分配的。

CAS无锁算法与ConcurrentLinkedQueue

CAS:Compare and Swap 比较并交换 java.util.concurrent包完全建立在CAS之上的,没有CAS就没有并发包.并发包借助了CAS无锁算法实现了区别于synchroni ...

链表的无锁操作 (JAVA)

看了下网上关于链表的无锁操作,写的不清楚,遂自己整理一部分,主要使用concurrent并发包的CAS操作. 1. 链表尾部插入 待插入的节点为:cur 尾节点:pred 基本插入方法: do{ pr ...

java并发:AtomicInteger 以及CAS无锁算法【转载】

1 AtomicInteger解析 众所周知,在多线程并发的情况下,对于成员变量,可能是线程不安全的: 一个很简单的例子,假设我存在两个线程,让一个整数自增1000次,那么最终的值应该是1000:但是 ...

CAS无锁机制原理

原子类 java.util.concurrent.atomic包:原子类的小工具包,支持在单个变量上解除锁的线程安全编程 原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读 ...

&lpar;转载&rpar;java高并发:CAS无锁原理及广泛应用

java高并发:CAS无锁原理及广泛应用   版权声明:本文为博主原创文章,未经博主允许不得转载,转载请注明出处. 博主博客地址是 http://blog.csdn.net/liubenlong007 ...

CAS无锁技术

前言:关于同步,很多人都知道synchronized,Reentrantlock等加锁技术,这种方式也很好理解,是在线程访问的临界区资源上建立一个阻塞机制,需要线程等待 其它线程释放了锁,它才能运行. ...

CAS无锁实现原理以及ABA问题

CAS(比较与交换,Compare and swap) 是一种有名的无锁算法.无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(N ...

探索CAS无锁技术

前言:关于同步,很多人都知道synchronized,Reentrantlock等加锁技术,这种方式也很好理解,是在线程访问的临界区资源上建立一个阻塞机制,需要线程等待 其它线程释放了锁,它才能运行. ...

CAS无锁模式

一.java内存模型:JMM 在内存模型当中定义一个主内存,所有声明的实例变量都存在于主内存当中,主内存的数据会共享给所有线程,每一个线程有一个块工作内存,工作内存当中主内存数据的副本当更新数据时,会 ...

随机推荐

PHP异步调用多线程

$data["name"] = 'godlike';$data["age"] = 18; $post = http_build_query($data);$le ...

安装两个tomcat

编辑环境变量:vi /etc/profile 加入以下代码(tomcat路径要配置自己实际的tomcat安装目录) ##########first tomcat########### CATALINA ...

Spring &lt&semi;bean&gt&semi; 参数意义

1.id bean的唯一标识, 2.class 类的完全限定名, 3.parent 父类bean定义的名字. 如果没有任何声明,会使用父bean,但是也可以重写父类.重写父类时,子bean 必须与父b ...

Codeforces GYM 100114 B&period; Island 水题

B. Island Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Description O ...

Linux如何查找大文件或目录总结-1127

原帖地址:http://www.cnblogs.com/kerrycode/p/4391859.html  谢谢潇湘隐者,谢谢老大 在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在 ...

JS判断浏览器是否支持某一个CSS3属性的方法

var div = document.createElement('div'); console.log(div.style.transition); //如果支持的话, 会输出 "&quo ...

《物联网框架ServerSuperIO教程》- 23&period;动态数据接口增加缓存,提高数据输出到OPCServer和(实时)数据库的效率

22.1   概述及要解决的问题 设备驱动有DeviceDynamic接口,可以继承并增加新的实时数据属性,每次通讯完成后更新这些属性数据.原来是通过DeviceDynamic接口实体类反射的方式获 ...

从源码的角度看 React JS 中批量更新 State 的策略(上)

在之前的文章「深入理解 React JS 中的 setState」与 「从源码的角度再看 React JS 中的 setState」 中,我们分别看到了 React JS 中 setState 的异步 ...

Linux下python2&period;7安装pip

首先下载并安装setuptools: wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py sudo python ez_ ...

dns服务器测试工具

下载地址:https://www.eatm.app/wp-content/uploads/2018/08/eDnsTest.20180810.zip

C语言链表无锁化CAS,CAS无锁操作相关推荐

  1. C语言 链表实现学生管理系统(含文件读写操作)

    主程序: #define _CRT_SECURE_NO_WARNINGS//跳过安全警告 #include "nodes.h"int main() {C* class0 = Cla ...

  2. 无锁数据结构--理解CAS、ABA、环形数组

    在分布式系统中经常会使用到共享内存,然后多个进程并行读写同一块共享内存,这样就会造成并发冲突的问题, 一般的常规做法是加锁,但是锁对性能的影响非常大. 无锁队列是一个非常经典的并行计算数据结构,它极大 ...

  3. 从“惊群”的现象来看并发锁,“死锁”问题的解决方案丨Redis单线程|共享内存|无锁实现|原子操作CAS

    从"惊群"的现象来看并发锁,"死锁"问题的解决方案 视频讲解如下,点击观看: 从"惊群"的现象来看并发锁,"死锁"问题的 ...

  4. 无锁CAS及无锁队列实现

    CAS ⽐较并交换(compare and swap, CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据 交换操作,从⽽避免多线程同时改写某⼀数据时由于执⾏顺序不确定性以及中断的不可 ...

  5. Java中的锁原理、锁优化、CAS、AQS详解

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:景小财 www.jianshu.com/p/e674ee68 ...

  6. Java中的锁[原理、锁优化、CAS、AQS]

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:用好Java中的枚举,真的没有那么简单!个人原创+1博客:点击前往,查看更多 作者:高广超 链接:https:/ ...

  7. Java中的锁原理、锁优化、CAS、AQS详解!

    阅读本文大概需要 2.8 分钟. 来源:jianshu.com/p/e674ee68fd3f 一.为什么要用锁? 锁-是为了解决并发操作引起的脏读.数据不一致的问题. 二.锁实现的基本原理 2.1.v ...

  8. AtomicInteger源码分析——基于CAS的乐观锁实现

    原文出处: bestStyle 1. 悲观锁与乐观锁 我们都知道,cpu是时分复用的,也就是把cpu的时间片,分配给不同的thread/process轮流执行,时间片与时间片之间,需要进行cpu切换, ...

  9. 原子操作的实现原理(锁和循环CAS)

    本文转自https://www.cnblogs.com/duanxz/archive/2012/08/09/2630071.html 一.引言 原子(atom)本意是"不能被进一步分割的最小 ...

最新文章

  1. python3 pip 更换国内 pypi 镜像 源
  2. 计算机组成原理的基础知识,计算机组成原理:基础知识部分习题解答(学习笔记)...
  3. 数据库设计(三)概念数据模型
  4. 二维非稳态导热微分方程_室内湿度影响验证:非真空型稳态法导热仪的正确使用方式...
  5. 读《大道至简》第四章有感
  6. numpy 删除元素
  7. c语言多线程怎么写,如何用C语言实现多线程
  8. JQ 1.9 API在线资源
  9. php修改音频文件_用php实现mp3音频文件下载功能
  10. LeCun、Bengio、Hinton三巨头曾合体,Nature发文综述深度学习(论文精华)
  11. matlab神经网络工具箱的使用
  12. matlab用图像,Matlab常用图像操作
  13. 今天干了件力活,手工写语句来完成数据库同步.
  14. 爱心捐赠爱传情 暖心行动暖寒冬
  15. 第十届蓝桥杯(国赛)——拼接
  16. Hyper-v安装虚拟机问题(持续更新)
  17. 用vb.net制作贪吃蛇游戏
  18. 组装台式电脑如何重装系统图文教程
  19. 十四.ARM裸机学习之iNand详解
  20. 线阵相机的优势是什么?如何选择线阵相机?

热门文章

  1. 系统之家ghost Win10 64位专业版ISO镜像下载 2020.05
  2. 奥运推迟,哪些黑科技将失之交臂
  3. Linux网络编程(数据链路层)
  4. qq五笔截图时会自动放大的问题
  5. JMeter连接数据库的相关操作
  6. 使用卷积和递归神经网络通过序列和本体表示改进circRNA-疾病关联预测
  7. 明可夫斯基距离和马氏距离
  8. 网上租房数据的爬取与分析
  9. 2018年泰牛PHP大牛班 基础+高级+实战+全套课件 视频教程 50G
  10. mysql主从和主主 模式配置