美文网首页
linux无锁化编程

linux无锁化编程

作者: 贰爷 | 来源:发表于2020-03-25 16:32 被阅读0次

linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础。

下面的东西整理自网络。先感谢大家的分享!

__sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇文章,英文好的同学可以直接去看原文。Multithreaded simple data type access and atomic variables

__sync_fetch_and_add系列一共有十二个函数,有加/减/与/或/异或/等函数的原子性操作函数,__sync_fetch_and_add,顾名思义,先fetch,然后自加,返回的是自加以前的值。以count = 4为例,调用__sync_fetch_and_add(&count,1),之后,返回值是4,然后,count变成了5.
有__sync_fetch_and_add,自然也就有__sync_add_and_fetch,呵呵这个的意思就很清楚了,先自加,在返回。他们哥俩的关系与i++和++i的关系是一样的。被谭浩强他老人家收过保护费的都会清楚了。
有了这个宝贝函数,我们就有新的解决办法了。对于多线程对全局变量进行自加,我们就再也不用理线程锁了。下面这行代码,和上面被pthread_mutex保护的那行代码作用是一样的,而且也是线程安全的。

__sync_fetch_and_add( &global_int, 1 );

下面是这群函数的全家福,大家看名字就知道是这些函数是干啥的了。
在用gcc编译的时候要加上选项 -march=i686
在我的服务器上,发现不加都可以。

type __sync_fetch_and_add (type *ptr, type value);
type __sync_fetch_and_sub (type *ptr, type value);
type __sync_fetch_and_or (type *ptr, type value);
type __sync_fetch_and_and (type *ptr, type value);
type __sync_fetch_and_xor (type *ptr, type value);
type __sync_fetch_and_nand (type *ptr, type value);
type __sync_add_and_fetch (type *ptr, type value);
type __sync_sub_and_fetch (type *ptr, type value);
type __sync_or_and_fetch (type *ptr, type value);
type __sync_and_and_fetch (type *ptr, type value);
type __sync_xor_and_fetch (type *ptr, type value);
type __sync_nand_and_fetch (type *ptr, type value);

下面这两个函数正是哥想要的啦,可以轻松实现互斥锁的功能。

bool __sync_bool_compare_and_swap (type*ptr, type oldval, type newval, ...)
type __sync_val_compare_and_swap (type *ptr, type oldval,  type newval, ...)

这两个函数提供原子的比较和交换,如果ptr == oldval,就将newval写入ptr,
第一个函数在相等并写入的情况下返回true.
第二个函数在返回操作之前的值。

__sync_synchronize (...)

为什么后边要写省略号,参照:http://blog.sunchangming.com/post/47188394133

还有两个函数:

type __sync_lock_test_and_set (type *ptr, type value, ...)

ptr设为value并返回ptr操作之前的值。

void __sync_lock_release (type *ptr, ...)

将*ptr置0

相关文章

  • linux无锁化编程

    linux支持的哪些操作是具有原子特性的?知道这些东西是理解和设计无锁化编程算法的基础。 下面的东西整理自网络。先...

  • 线程同步与互斥

    Linux--线程编程 多线程编程-互斥锁 线程同步与互斥 互斥锁 信号量 条件变量 互斥锁 互斥锁的基本使用...

  • [Linux C]无锁编程之小记

    众所周知,对共享数据的同步和保护基本上都要用到锁。锁的种类也很多,如常用的互斥锁,读写锁,信号量,自旋锁等等。但用...

  • 无锁算法——CAS原理

    一、无锁算法 CAS(比较与交换,Compare and swap) 是一种有名的无锁算法。无锁编程,即不使用锁的...

  • Java并发编程之并发容器 CopyOnWrite,Concur

    前言 JUC 高并发容器是基于非阻塞算法(或者无锁编程算法)实现的容器类,无锁编程(Lock Free)算法主要通...

  • 高并发下Java多线程编程基础

    Java线程同步与异步 线程池 无锁化的实现方案 分布锁的实现方案 分享的目的: 进一步掌握多线程编程和应用的技巧...

  • 无锁编程基础

    背景 我们处在技术快速发展的时代,竞争变得前所未有的激烈,不仅要十八般武艺俱全,还得选对正确的技术,跟上发展的脚步...

  • Java单例模式的正确写法

    无锁lazy初始化

  • 自旋锁

    简单回顾一下CAS算法 CAS算法即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程...

  • Java并发编程-无锁

    对于并发控制而言,锁是一种悲观策略。它总是假设每次临界区操作都会产生冲突,因此如果有多个线程同时访问临界区资源,就...

网友评论

      本文标题:linux无锁化编程

      本文链接:https://www.haomeiwen.com/subject/jlrxuhtx.html