linux无锁化编程--__sync_fetch_and_add系列原子操作函数

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

// sam:在我的服务器上,发现不加都可以。

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);

// sam:很纳闷为什么后边要写省略号,是不是还有不需要我们关心的参数?用的时候不需要传参数?下面这两个函数正是哥想要的啦,可以轻松实现互斥锁的功能。

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

时间: 2024-11-05 21:59:15

linux无锁化编程--__sync_fetch_and_add系列原子操作函数的相关文章

(转)高效线程池之无锁化实现(Linux C)

本文链接:https://blog.csdn.net/xhjcehust/article/details/45844901 笔者之前照着通用写法练手写过一个小的线程池版本,最近几天复习了一下,发现大多数线程池实现都离不开锁的使用,如互斥量pthread_mutex*结合条件变量pthread_cond*.众所周知,锁的使用对于程序性能影响较大,虽然现有的pthread_mutex*在锁的申请与释放方面做了较大的优化,但仔细想想,线程池的实现是可以做到无锁化的,于是有了本文. 1.常见线程池实现原

高效线程池之无锁化实现(Linux C)

笔者之前练手写过一个小的线程池版本(已上传至https://github.com/xhjcehust/thread-pool),最近几天复习了一下,发现大多数线程池实现都离不开锁的使用,如互斥量pthread_mutex*结合条件变量pthread_cond*.众所周知,锁的使用对于程序性能影响较大,虽然现有的pthread_mutex*在锁的申请与释放方面做了较大的优化,但仔细想想,线程池的实现是可以做到无锁化的,于是有了本文. 1.常见线程池实现原理 如上图所示,工作队列由主线程和工作者线程

无锁多线程编程初步(基础部分)

1.volatile 关于volatile可讲述的部分有很多,不过精简的说这个关键字的功能有两点. a.volatile修饰的变量对如果有修改,会对任意线程可见. b.volatile修饰的变量: 如果是volatile写,那么它可以保证任何在它之前需要完成的读写都会完成,但是它之后的读写不能保证. 如果是volatile度,那么它可以保证后面的普通读写操作不会挪到它前面来执行,但它不能保证它之前的读写不会跑到它后面执行. 2.CAS CAS操作是一种不可靠的原子操作,它的返回值有可能成功,有可

Java中ThreadLocal无锁化线程封闭实现原理

虽然现在可以说很多程序员会用ThreadLocal,但是我相信大多数程序员还不知道ThreadLocal,而使用ThreadLocal的程序员大多只是知道其然而不知其所以然,因此,使用ThreadLocal的程序员很多时候会被它导入到陷进中去,其实java很多高级机制系列的很多东西都是一把双刃剑,也就是有利必有其弊,那么我们的方法是找到利和弊的中间平衡点,最佳的方式去解决问题. 本文首先说明ThreadLocal能做什么,然后根据功能为什么要用它,如何使用它,最后通过内部说明讲解他的坑在哪里,使

无锁编程实战演练

前段时间研究过一阵子无锁化编程.刚写了几个简单的程序,来验证了下自己学到的一些概念. 测试场景:假设有一个应用:现在有一个全局变量,用来计数,再创建10个线程并发执行,每个线程中循环对这个全局变量进行++操作(i++),循环加2000000次. 所以很容易知道,这必然会涉及到并发互斥操作.下面通过三种方式来实现这种并发操作.并对比出其在效率上的不同之处. 这里先贴上代码,共5个文件:2个用于做时间统计的文件:timer.h  timer.cpp.这两个文件是临时封装的,只用来计时,可以不必细看.

[转载] 无锁编程本质论

原文: http://weibo.com/p/1001603876869958445266 作者:新浪微博(@NP等不等于P) 计算机学习微信公众号(jsj_xx) 无锁编程真的是不涉及锁么?无锁编程实现的本质是什么?需要操作系统或者编译器的支持么?本文尝试解答这些问题. 1 锁引发的问题 使用锁时要特别防止出现死锁或活锁.死锁的情况很简单,就是申请者在申请过程中由于顺序原因(多个锁没有按固定顺序申请)进入堵塞状态了,指定顺序即可规避.我们只看一个活锁的例子: 两个线程都在尽量避免死锁,但是却有

大数据时代,优化家的入口体验——无锁防盗门

钥匙没地方装?总是忘带钥匙?总是丢钥匙?开锁高手太多?那就干脆借助大数据,试试无锁开门吧! 前段时间,支付宝发布了新版本,显著变化除了蓝色的新图标外,要数引起一番小争议的“取消登录密码”了. 支付宝声称其是基于大数据的安全保障,并且提供了免费的账户保险. 由此想到,我们何不利用大数据+保险,来提升家的入口——门的用户体验呢? 完全可以通过摄像头及其他传感器,分析主人的作息规律,被信任的客人等信息,最终做到自动开锁,免去钥匙的麻烦与安全隐患. 甚至可以根据大数据判断站在门口的是不是小偷或其他有恶意

JQUERY下的组件化编程之基本框架

var PROWEBAPPS = (function(){ var module = { ViewManager:(function(){ var submodule = { activate:function(){ console.log("main..."); } }; return submodule; })(), }; return module; })(); $(document).ready(function(){       PROWEBAPPS.ViewManager.

透过 Linux 内核看无锁编程

非阻塞型同步 (Non-blocking Synchronization) 简介 如何正确有效的保护共享数据是编写并行程序必须面临的一个难题,通常的手段就是同步.同步可分为阻塞型同步(Blocking Synchronization)和非阻塞型同步( Non-blocking Synchronization). 阻塞型同步是指当一个线程到达临界区时,因另外一个线程已经持有访问该共享数据的锁,从而不能获取锁资源而阻塞,直到另外一个线程释放锁.常见的同步原语有 mutex.semaphore 等.如