码迷,mamicode.com
首页 > 编程语言 > 详细

c++中的原子操作

时间:2016-05-17 13:05:05      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

1. c/c++标准中没有定义任何操作符为原子的,操作符是否原子和平台及编译器版本有关

2. GCC提供了一组内建的原子操作,这些操作是以函数的形式提供的,这些函数不需要引用任何头文件

  2.1 对变量做某种操作,并且返回操作前的值,总共6个函数:

    type __sync_fetch_and_add (type *ptr, type value, ...)    加减运算 相当于  tmp = *ptr;  *ptr += value; return tmp;

    type __sync_fetch_and_sub (type *ptr, type value, ...)    加减运算 相当于  tmp = *ptr;  *ptr -= value; return tmp;

    type __sync_fetch_and_or (type *ptr, type value, ...)       逻辑运算 相当于  tmp = *ptr;  *ptr |= value; return tmp;

    type __sync_fetch_and_and (type *ptr, type value, ...)     逻辑运算 相当于  tmp = *ptr;  *ptr &= value; return tmp;

    type __sync_fetch_and_xor (type *ptr, type value, ...)     位运算 相当于  tmp = *ptr;  *ptr ^= value; return tmp;

    type __sync_fetch_and_nand (type *ptr, type value, ...)   位运算 相当于  tmp = *ptr; *ptr = ~(tmp & value); return tmp;

           注意,__sync_fetch_and_nand在GCC的4.4版本之前语义并非如此,而是 tmp = *ptr; *ptr = ~tmp & value; return tmp;

  2.2 对变量做某种操作,并且返回操作后的值,总共6个函数,和前面的6个函数完全类似:

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

  2.3 把变量的值和某个值比较,如果相等就把变量的值设置为新的值,总共2个函数:

    bool __sync_bool_compare_and_swap (type *ptr, type oldval type newval, ...)   

      返回是否相等,相当于

         if ( *ptr == oldval ) {*ptr = newval; return true;}

                          else {return false;}

    type __sync_val_compare_and_swap (type *ptr, type oldval type newval, ...)

      返回修改前的值,相当于

         tmp = *ptr 

         if ( *ptr == oldval ) { *ptr= newval; }

                          return tmp ;

  2.4 锁定测试-设置 及 解锁,总共2个函数: 

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

      把变量的值设置为新值,并返回设置前的值,相当于tmp = *ptr; return tmp

    void __sync_lock_release (type *ptr, ...)  

      把变量的值设置为0,相当于 *ptr = 0  通过查看汇编代码,可以看出这个函数使用了内存屏障,然后再把变量的值置为0

            这两个函数可以实现自旋锁

3. 自旋锁的实现:

 

c++中的原子操作

标签:

原文地址:http://www.cnblogs.com/liyulong1982/p/5500854.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!