下列内建函数旨在兼容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

最新文章

  1. CC2540重写按键
  2. C++ 利用 libxl 将 Excel 文件转化为 Xml 文件
  3. java重载和重写的区别
  4. win7自动登录桌面
  5. C基础--函数参数副本
  6. Java内部类的自我理解
  7. Mvc controller单元测试 Mock Url对象
  8. 关于sql server 代理(已禁用代理xp)
  9. osip及eXosip的编译方法
  10. React渲染问题研究以及Immutable的应用
  11. anaconda安装加速镜像问题解决
  12. HSF服务的开发与使用
  13. Sublime Text 3删除插件
  14. Mac端StartUML的安装和破解
  15. spark wordcount 编程模型详解
  16. As 400错
  17. asp.net mvc项目使用spring.net发布到IIS后,在访问提示错误 Could not load type from string value 'DALMsSql.DBSessionFactory,DALMsSql'.
  18. 在做销售录入界面时,如何使用dbgrid?(50分)
  19. spark使用hadoop native库
  20. 大公司怎么做Android代码混淆的?

热门文章

  1. python requests包的基本使用
  2. k8s的paas平台
  3. html知识补充
  4. 《hello--world团队》第五次作业:项目需求分析改进与系统设计
  5. 三、vue基础--表单绑定
  6. region特征
  7. vscode源码启动时需要的electron缓存位置
  8. Java中CAS-ABA的问题解决方案
  9. 洛谷P2661 信息传递【并查集】
  10. 2019 杭电多校第八场 HDU - 6665 Calabash and Landlord 两矩形分平面