多线程模型下的无锁编程「建议收藏」

多线程模型下的无锁编程「建议收藏」多线程模式是比较流行的一种并发编程模型,多线程编程的一个特点就是线程间共享内存空间;这可以降低线程间通信的开销,但却引来了另外的一个难缠的问题:竟态条件!,因此,甚至有人对多线程模型提出了质疑,看这里。在多线程编程模型下,解决竟态条件的传统方法就是加锁保护临界区,但这存在影响系统性能、优先级反转等问题.因此又有人提出了,多线程模型下无锁编程的一些方式:1.线程内通信框架:Di

大家好,又见面了,我是你们的朋友全栈君。多线程模式是比较流行的一种并发编程模型,多线程编程的一个特点就是线程间共享内存空间;这可以降低线程间通信的开销,但却引来了另外的一个难缠的问题:竟态条件!,因此,甚至有人对多线程模型提出了质疑,看
这里





在多线程编程模型下,解决竟态条件的传统方法就是加锁保护临界区,但这存在影响系统性能、优先级反转等问题.




因此又有人提出了,多线程模型下无锁编程的一些方式:


1.线程内通信框架: Disruptor, 这是一款开源的并发框架,用于线程间无锁的共享数据,看
这里





2.无锁数据结构


无锁数据结构一般基于一个很重要的操作:CAS–Compare And Swap(看
这里
)。


用C语言表达的一个CAS实现的操作是这样的:

  1. /*定义CAS操作*/
  2. #define CAS __sync_bool_compare_and_swap
  3. /*
  4. * 定义stack的数据结构
  5. */
  6. typedef struct stack_node {

  7.     struct node *next;
  8.     void *data;
  9. }stack_node;
  10. /*栈顶指针*/
  11. stack_node *top = NULL;



CAS的一个重要特性是其必须是原子操作。现在大多数CPU都支持指令级别的CAS操作。


GCC编译也提供了这样的接口:bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, …)




有了这个原子的CAS后,我们就能实现自己的无锁数据结构了,下面我们就尝试着来实现一个无锁栈:




下面的代码中,我们假设malloc与free是线程安全的(至于malloc与free的可重入性与线程安全问题,可以看
这里

这里
)

首先定义必要的数据结构:

  1. /*定义CAS操作*/
  2. #define CAS __sync_bool_compare_and_swap
  3. /*
  4. * 定义stack的数据结构
  5. */
  6. typedef struct stack_node {

  7.     struct node *next; /*指向下一个节点,即通过链表的形式实现栈*/
  8.     void *data;/*指向该节点的数据*/
  9. }stack_node;
  10. /*栈顶指针*/
  11. stack_node *top = NULL;

接下来是
栈操作:

  1. /*压栈操作*/
  2. void stack_push(void *data)
  3. {

  4.     stack_node *new = malloc(sizeof(struct node));
  5.     new>data = data;
  6.     do {

  7.         new>next = top;/*获取top的快照, 同时初始化了new的next指针*/
  8.     }while(!CAS(&top, new>next, new));
  9. }

在取得top的快照后后, 就通过CAS操作查看top的内容与line 7取得的快照是否一致,如果一致则将top的内容更换为new,CAS函数返回true。

假设有线程A在
stack_push里获取top快照后暂时失去了执行权, 切换至另一个线程B, 而线程B完成了一次
stack_push操作,然后执行权再次回到线程A,

线程A执行CAS操作, 发现top里的内容与快照里的内容已经不一致了,CAS返回false, 估do…while语句重新执行。



接下来是出栈操作:

  1. /*出栈操作*/
  2. void * stack_pop(void)
  3. {

  4.     stack_node *tmp;
  5.     void *data;
  6.     
  7.     do {

  8.         tmp = top;
  9.         if (!tmp) return NULL;
  10.     }while(CAS(&top, tmp, tmp>next) = true);
  11.     data = tmp>data;
  12.     free(tmp);
  13.     return data;
  14. }

其免锁原理与入栈基本一样,估不再赘述。



另外还有一点, 在使用CAS实现免锁数据结构时, 容易出现ABA问题, 这里也暂时不作讨论, 可以从参考资料中得到更多的信息。




参考资料:


1.来自酷客的无锁队列


2.
设计不用互斥锁的并发数据结构

3.透过linux内核看无锁编程

转载自:http://blog.chinaunix.net/uid-25424552-id-3772253.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141681.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • git拉取代码如何解决冲突_Git工具-git pull拉取代码时冲突的解决办法[通俗易懂]

    git拉取代码如何解决冲突_Git工具-git pull拉取代码时冲突的解决办法[通俗易懂]一,在使用gitpull命令拉取代码时,有时会遇到以下错误信息:error:Yourlocalchangestothefollowingfileswouldbeoverwrittenbymerge:…Pleasecommityourchangesorstashthembeforeyoumerge.AbortingUpdating1d17a2c5..3de3e123可按以下步骤解决此问题:1.先将本地修改存储起来使用gitst

  • pki体系包括_pct体系简介

    pki体系包括_pct体系简介1:PKI的概念        PKI(publickeyinfrastructure),即公钥基础设施,是一种以数字证书机制为基础,依托应用密码学技术(特别是公钥技术,包括加密、签名等应用技术模式)实施并提供安全服务的具体普遍适用性的网络安全基础设施。2:PKI的功能        一个有效的PKI系统必须是安全的和透明的,它的主要目的是通过自动管理密钥和证书,为用户建立起一个安全的

  • Double转BigDecimal进行四舍五入操作时会出现数据损失

    Double转BigDecimal进行四舍五入操作时会出现数据损失工作中遇到四舍五入的处理,查了资料都是讲三种常见的方法。这里就不说了。实际上你会发现,在用BigDecimal转换时根本不是想像中的那么简单。看代码:java.math.BigDecimalbd=newjava.math.BigDecimal(115.5225);//这里将浮点数转化为BigDecimalDoubled=bd.setScale(3,java.math.Bi

  • 使用panel1,切换页面

    使用panel1,切换页面定义变量UserControl1urs1_Control;UserControl2urs2_Control;UserControl3urs3_Control;UserControl4u

  • golang二叉树遍历_2021年9月编程语言

    golang二叉树遍历_2021年9月编程语言usingMicrosoft.AspNetCore.Builder;usingMicrosoft.Extensions.DependencyInjection;usingMicrosoft.Extensions.Hosting;usingMicrosoft.OpenApi.Models;usingVolo.Abp;usingVolo.Abp.AspNetCore.Mvc;usingVolo.Abp.Autofac;usingVolo.Abp.Modularity;using

  • 影视短视频剪辑的完整操作流程(普通人也能学会)

    影视短视频剪辑的完整操作流程(普通人也能学会)嗨喽,大家好,我是会玩运营,能写代码,文案设计样样精通的江湖美男子菜鸟哥,一名走在营销路上的小菜鸟。点击上方蓝字“关注”,每天为你分享有用的营销运营干货。上一篇文章我们讲解了《全网最全抖音运营攻略》,相信看完这篇文章的朋友对于短视频运营多少有了一定的了解,文中的2020年抖音用户画像报告,我们了解到短视频用户对于影视类的作品关注度还是非常高的,今天我们就结合案例来为大家进行更加详细的讲解。本文将带你初步了解抖音、快手短视频中影视剪辑的完整操作流程,没有过多复杂的骚操作,零基础的普通人也能够看懂。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号