gcc 提供的原子操作 __sync_xxx

来源:互联网 发布:淘宝购买流程 编辑:程序博客网 时间:2024/06/04 21:50

gcc 提供的原子操作 __sync_xxx 系列

  • gcc 原子操作, 多线程下变量操作的原子性.

    • 版本要求: gcc >= 4.1.2.
    • 有测发现不用include任何头文件,gcc编译时会自动替换成对应的汇编代码.
  • 可操作的内存对象type只能是1,2,4,8字节. 这也是局限之处.

  • 下面是操作的名字,见名知意.

    • 官网介绍: http://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Atomic-Builtins.html
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);bool __sync_bool_compare_and_swap (type*ptr, type oldval, type newval, ...)type __sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)type __sync_lock_test_and_set (type *ptr, type value, ...)void __sync_lock_release (type *ptr, ...)__sync_synchronize (...)

原理:

  • 利用intel指令 lock 前缀指令, gcc将代码翻译成汇编代码后,执行时汇编代码具有内存排他性.

  • 自行用gcc汇编一下, gcc -S sync_test.c -o sync_test.o. 可以看到:

static int count = 0;__sync_fetch_and_add(&count,1);
  • 翻译成如下指令:
lock addl   $1, count(%rip)

和 互斥量加锁 的比较:

  • 简单点说的话,在小规模的问题上还是可以用用 __sync_xx的。在大规模等分布式计算上,还是有锁更通用.
  • 具体深入的比较可以看看这个帖子.
    • http://www.cnblogs.com/silentNight/p/5685629.html
0 0