GNU中用于原子内存访问的内置函数

https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html

API功能
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, …)
{ tmp = *ptr; *ptr op= value; return tmp; }
{ tmp = *ptr; *ptr = ~tmp & value; return tmp; } // nand
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 op= value; return *ptr; }
{ *ptr = ~*ptr & value; return *ptr; } // nand
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。如果比较成功且写入了newval,则“bool”版本返回true。“val”版本返回操作前*ptr的内容。
__sync_synchronize (…)This builtin issues a full memory barrier.
type __sync_lock_test_and_set (type *ptr, type value, …)将value写入ptr,对ptr加锁,并返回操作之前*ptr的值。很多实现 value 只能为 1,并且返回的原始ptr值是实现定义的。
void __sync_lock_release (type *ptr, …)将0写入到ptr,并对ptr解锁。

这些函数被视为 完整内存障,也就是内存计数器(这是个啥?指令计数器吗?)不会越过这条指令,不管向前还是向后。必要时这些指令可以防止处理器跨操作推测负载,并防止操作后排队存储。

c++11 的memory barrier有很多种:

  • full memory barrier(mb)
  • release memory barrier(relb)
  • acquire memory barrier(acqb)
  • write memory barrier(wb)
  • read memory barrier(rb)
  • data dependency memory barrier(ddrb)

Acquire是说,在Acquire之后的读写指令都不能和Acquire之前的read指令乱序
Release是说,在Release之后的write指令都不能和Release之前的读写指令乱序

Gemini的代码这个文件取名是 atomic.hpp,但是其实是用的 memory barrier。

关于 memory barrier 有很多理论,先看了两篇英文博客了解了下概念,后面需要再学。

https://preshing.com/20120625/memory-ordering-at-compile-time/

https://preshing.com/20120710/memory-barriers-are-like-source-control-operations/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值