Atomic Builtins - Using the GNU Compiler Collection (GCC) GCC 提供的原子操作
http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Atomic-Builtins.html
gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。
5.47 Built-in functions for atomic memory access
The following builtins are intended to be compatible with those described in the Intel Itanium Processor-specific Application Binary Interface, section 7.4. As such, they depart from the normal GCC practice of using the “__builtin_” prefix, and further that they are overloaded such that they work on multiple types.
The definition given in the Intel documentation allows only for the use of the types int, long, long long as well as their unsigned counterparts. GCC will allow any integral scalar or pointer type that is 1, 2, 4 or 8 bytes in length.
Not all operations are supported by all target processors. If a particular operation cannot be implemented on the target processor, a warning will be generated and a call an external function will be generated. The external function will carry the same name as the builtin, with an additional suffix `_n' where n is the size of the data type.
In most cases, these builtins are considered a full barrier. That is, no memory operand will be moved across the operation, either forward or backward. Further, instructions will be issued as necessary to prevent the processor from speculating loads across the operation and from queuing stores after the operation.
All of the routines are described in the Intel documentation to take “an optional list of variables protected by the memory barrier”. It's not clear what is meant by that; it could mean that only the following variables are protected, or it could mean that these variables should in addition be protected. At present GCC ignores this list and protects all variables which are globally accessible. If in the future we make some use of this list, an empty list will continue to mean all globally accessible variables.
- type
__sync_fetch_and_add (type*ptr,typevalue, ...) - type
__sync_fetch_and_sub (type*ptr,typevalue, ...) - type
__sync_fetch_and_or (type*ptr,typevalue, ...) - type
__sync_fetch_and_and (type*ptr,typevalue, ...) - type
__sync_fetch_and_xor (type*ptr,typevalue, ...) - type
__sync_fetch_and_nand (type*ptr,typevalue, ...) - These builtins perform the operation suggested by the name, and returns the value that had previously been in memory. That is,
{ tmp = *ptr; *ptr op= value; return tmp; }
{ tmp = *ptr; *ptr = ~(tmp & value); return tmp; } // nandNote: GCC 4.4 and later implement
__sync_fetch_and_nandbuiltin as*ptr = ~(tmp & value)instead of*ptr = ~tmp & value. - type
__sync_add_and_fetch (type*ptr,typevalue, ...) - type
__sync_sub_and_fetch (type*ptr,typevalue, ...) - type
__sync_or_and_fetch (type*ptr,typevalue, ...) - type
__sync_and_and_fetch (type*ptr,typevalue, ...) - type
__sync_xor_and_fetch (type*ptr,typevalue, ...) - type
__sync_nand_and_fetch (type*ptr,typevalue, ...) - These builtins perform the operation suggested by the name, and return the new value. That is,
{ *ptr op= value; return *ptr; }
{ *ptr = ~(*ptr & value); return *ptr; } // nandNote: GCC 4.4 and later implement
__sync_nand_and_fetchbuiltin as*ptr = ~(*ptr & value)instead of*ptr = ~*ptr & value. bool __sync_bool_compare_and_swap (type*ptr,typeoldvaltypenewval, ...)- type
__sync_val_compare_and_swap (type*ptr,typeoldvaltypenewval, ...) - These builtins perform an atomic compare and swap. That is, if the current value of
*ptr is oldval, then write newval into*ptr.The “bool” version returns true if the comparison is successful and newval was written. The “val” version returns the contents of
*ptr before the operation. __sync_synchronize (...)- This builtin issues a full memory barrier.
- type
__sync_lock_test_and_set (type*ptr,typevalue, ...) - This builtin, as described by Intel, is not a traditional test-and-set operation, but rather an atomic exchange operation. It writes value into
*ptr, and returns the previous contents of*ptr.Many targets have only minimal support for such locks, and do not support a full exchange operation. In this case, a target may support reduced functionality here by which the only valid value to store is the immediate constant 1. The exact value actually stored in
*ptr is implementation defined.This builtin is not a full barrier, but rather an acquire barrier. This means that references after the builtin cannot move to (or be speculated to) before the builtin, but previous memory stores may not be globally visible yet, and previous memory loads may not yet be satisfied.
void __sync_lock_release (type*ptr, ...)- This builtin releases the lock acquired by
__sync_lock_test_and_set. Normally this means writing the constant 0 to*ptr.This builtin is not a full barrier, but rather a release barrier. This means that all previous memory stores are globally visible, and all previous memory loads have been satisfied, but following memory reads are not prevented from being speculated to before the barrier.
Atomic Builtins - Using the GNU Compiler Collection (GCC) GCC 提供的原子操作的更多相关文章
- GCC/gcc/g++/CC/cc区别
平常在Linux上经常会用到gcc或者g++来编译程序,但对这两者的理解也就停留在一个是用来编译C程序,另一个是用来编译C++程序的(请注意:这种说法是有问题的,待会改进). 1. GCC GCC,是 ...
- C++ Standards Support in GCC - GCC 对 C++ 标准的支持
C++ Standards Support in GCC - 2019-2-20 GCC supports different dialects of C++, corresponding to th ...
- 转载:GCC 提供的原子操作
转载自:GCC 提供的原子操作 GCC 提供的原子操作 gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作. 其声明如下: type __sync_f ...
- paper 150:GCC--GNU Compiler Collection(GNU编译器套件)
gcc命令 编程开发 gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点.现在很多程序员都应用GCC, ...
- GNU C/C++ __attributes__ GCC中的弱符号与强符号
最近在看一些源代码,遇到了一些使用__attribute__修饰函数和变量的属性方面的代码,不是太了解,很是汗颜,再此做个总结: GCC使用__attribute__关键字来描述函数,变量和数据类 ...
- gcc提供的原子操作函数
gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作.其声明如下: type __sync_fetch_and_add (type *ptr, type ...
- Gcc ------ gcc的使用简介与命令行参数说明
gcc的使用简介与命令行参数说明 2011年06月19日 20:29:00 阅读数:10221 2011-06-19 wcdj 参考:<GNU gcc嵌入式系统开发 作者:董文军> (一) ...
- GCC 提供的原子操作
gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作. 其声明如下: type __sync_fetch_and_add (type *ptr, typ ...
- arm 开发板更新 gcc/gcc++ | Debain 更新 gcc,无需编译直接更新 gcc
4我的板子是 Orange pi 3,只能以 卧槽来形容... 我是搞.net core的,这板子死活搞不了. 刷的是Debain系统. 说实话,这个板子不错,可就是官方的系统实在不敢恭维,内核旧,软 ...
随机推荐
- python爬虫---实现项目(一) Requests爬取HTML信息
上面的博客把基本的HTML解析库已经说完了,这次我们来给予几个实战的项目. 这次主要用Requests库+正则表达式来解析HTML. 项目一:爬取猫眼电影TOP100信息 代码地址:https://g ...
- 《3+1团队》【Alpha】Scrum meeting 1
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 3+1团队 团队博客地址 https://home.cnblogs.com/u/3-1group ...
- Spring boot 项目打成war包并在idea中运行
1. 修改pom文件原来是jar改成<packaging>war</packaging> 2. 在pom文件中添加移除内置tomcat并且添加添加servlet-api的依赖. ...
- TCP三次握手简单理解
- redis:哨兵集群配置
最少配置1主2从3哨兵 一.引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...
- Mysql 参数优化
- luogu2468 [SDOI2010]粟粟的书架
二合一-- #include <iostream> #include <cstdio> using namespace std; int r, c, m, a[205][205 ...
- String类型根据逗号分隔转为list
String ids = pd.getString("IDS");//从pd里取出字符串 List idList = Arrays.asList(ids.split(", ...
- linux shell管道和xargs的区别
如上图,加了xargs的话相当于将上一个操作的结果作为命令执行前的操作,不加的话直接先把后面的命令运行一遍再操作
- js清除非数字输入
function clearNoNum(obj) { obj.value = obj.value.replace(/[^\d.]/g, ""); //清除“数字”和“.”以外的字符 ...