下列内建函数旨在兼容Intel Itanium Processor-specific Application Binary Interface, section 7.4. 因此,这些函数区别于普通的GCC内建函数,不使用”__builtin_”前缀.

这些函数被重载,可以传入多种类型的参数.Intel文档只允许使用unsigned的int,long,long long类型.GCC允许所有长度为1,2,4,8bytes的标量或指针.

不是所有处理器都支持下述操作的,如果一个特定的操作不被支持,将会产生警告.

1.RMW系列(Read-Modify-Write)

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, ...)

两组函数都改变了*ptr的值.唯一的区别是__sync_fetch_and_xxx系列返回改变前的值, __sync_xxx_and_fetch系列返回改变后的值.另,nand操作为*ptr = ~*ptr & value(取非然后逻辑与)

2.CAS系列(compare and swap)

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

bool版本函数在比较为true,newval成功写入*ptr时返回true.

Val版本函数返回在操作进行前*ptr的值.

3.发出full memory barrier

__sync_synchronize (...)

内存屏障是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作.

内存屏障有两个功能:1,保证了屏障前的指令在屏障后的指令先行完成.2,一旦内存数据被推送到缓存,就确保所有缓存会对所有的共享数据同步并保持一致

多线程编程中,存在CPU高速缓存和内存的一致性问题.一个处理器上的线程修改了某项数据,而在另一处理器上的线程可能仍然使用着该数据在专用cache(CPU中)的老值.解决方法是令该数据为volatile属性,或读该数据之前执行内存屏障

4.上锁

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

该函数表现为:把value写入*ptr,返回原先*ptr的值.

一些处理器只支持value=1.

因此,可以假定value=0为无锁,value=1为上锁

5.解锁

void __sync_lock_release (type *ptr, ...)

表现为:把0写入*ptr

Linux -- GCC Built-in functions for atomic memory access的更多相关文章

  1. HK32F030MF4P6的Linux GCC工具链和VSCode开发环境

    HK32F030MF4P6简介 航顺的 HK32F030MF4P6, TSSOP20封装, Arm Cortex M0 内核, 内建32MHz时钟, 16K Flash, 2K RAM(实际上可用的有 ...

  2. linux gcc 编译动态类库(.so)和静态类库(.a)

    linux gcc 编译动态类库(.so)和静态类库(.a) 我的编译环境 ubuntu desktop 16.04 一:测试代码 测试有3个文件:AB.h,AB.c,test.c //AB.h vo ...

  3. linux内核打印"BUG: scheduling while atomic

    linux内核打印"BUG: scheduling while atomic"和"bad: scheduling from the idle thread"错误 ...

  4. linux gcc loudong

    五事九思 (大连Linux主机维护) 大连linux维护qq群:287800525 首页 日志 相册 音乐 收藏 博友 关于我     日志       spcark_0.0.3_i386.src.t ...

  5. linux gcc++漏洞:普通用户获得root权限

    linux gcc++漏洞:普通用户获得root权限 2012-02-06 10:22:38|  分类: linux安全|举报|字号 订阅       经我测试在RHEL5 / CentOS5 / F ...

  6. Ubuntu12.4 64位 安装 arm linux gcc 4.3.2

    一.下载arm linux gcc 4.3.2 http://pan.baidu.com/share/link?shareid=1575352696&uk=2754759285&fid ...

  7. zabbix修改Template OS Linux模版使已使用内存(Used memory)更准确

    说明: [root@coolnull ~]# free -m total used free shared buffers cached Mem: 995 785 209 0 6 92 -/+ buf ...

  8. linux gcc 区分32位或64位编译 && 请问arm存储,是以小端格式还是以大端格式?

    linux gcc 区分32位或64位编译   Linux系统下程序如何区分是64位系统还是32位系统 经过对include的翻查,最后确定gcc以__i386__来 进行32位编码,而以__x86_ ...

  9. 深入剖析 linux GCC 4.4 的 STL string

    转自: 深入剖析 linux GCC 4.4 的 STL string 本文通过研究STL源码来剖析C++中标准模板块库std::string运行机理,重点研究了其中的引用计数和Copy-On-Wri ...

随机推荐

  1. Using Microsoft Visual C++ DLLs with C++Builder

    Using Microsoft Visual C++ DLLs with C++Builder As powerful as C++Builder is, the majority of DLLs d ...

  2. idea的jdk版本问题

    问题描述: 解决: 检查以上是否版本一致. 不行就再检查下面的: 如果上面的方法还是不行的话,就建议你改一下pom文件中的maven插件编译级别,可以通过搜索所有的pom.xml,1.6这个关键词,就 ...

  3. JavaScript 隐式原型(_proto_)与显示原型(prototype)

    作者:苏墨橘链接:https://www.zhihu.com/question/34183746/answer/59043879来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  4. [51Nod 1238] 最小公倍数之和 (恶心杜教筛)

    题目描述 求∑i=1N∑j=1Nlcm(i,j)\sum_{i=1}^N\sum_{j=1}^Nlcm(i,j)i=1∑N​j=1∑N​lcm(i,j) 2<=N<=10102<=N ...

  5. 如何使用python内置的request发送JSON格式的数据

    使用步骤如下: 一.如果想发送json格式的数据,需要使用request模块中的Request类来创建对象,作为urlopen函数的参数 二.header中添加content-type为applica ...

  6. 01_Tutorial 1: Serialization 序列化

    1.序列化 1.官方教程 https://q1mi.github.io/Django-REST-framework-documentation/tutorial/1-serialization_zh/ ...

  7. linux系统常用软件

    输入法---搜狗输入法 音乐播放器---网易云音乐 邮箱---

  8. SQL切分字符串成int和for xml path

    切分字符 SqlServer切割字符串示例: --declare @StrDId nvarchar(2000) --set @StrDId='100,200,400,500,600' --转换ID,防 ...

  9. sql server update inner join on 的使用

    假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price:另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段Price更新为Price表中 ...

  10. learning scala extractor object

    package com.aura.scala.day01 import scala.util.Random object extractorObject { def main(args: Array[ ...