基本原子操作

1 处理器支持的一系列原子操作

1.1 CAS(Compare And Swap/Set)

详细内容参考 wiki, 下面是我的理解

1.1.1 函数原型
int compare_and_swap(int* reg, int oldval, int newval) {
...
}
1.1.2 实现逻辑
  1. 根据传入的参数oldval和内存地址存放的值*reg比较
    1. 如果相同则让内存地址存放新值
    2. 如果不同则不做操作

      说明此时有竞争的线程抢先修改了内存地址存放的值,因此不做操作

  2. 返回值有两种,因此实现代码也有两种,第一种比较方便因此推荐
    1. 如果操作成功则返回true,不成功返回false
      bool compare_and_swap(int *accum, int *dest, int newval)
      {
        if (*accum == *dest) {
            *dest = newval;
            return true;
        } else {//此时有竞争的线程抢先修改了内存地址存放的值,因此不做操作
            *accum = *dest;
            return false;
        }
      }
      
    2. 或者仅仅返回执行CAS操作前的内存存放的值
      int compare_and_swap(int* reg, int oldval, int newval)
      {
        ATOMIC();
        int old_reg_val = *reg;
        if (old_reg_val == oldval)
           *reg = newval;
        END_ATOMIC();
        return old_reg_val;
      }
      
1.1.3 C++11标准库

C++11标准提供了几个atomic_compare_exchange 开头的函数,以后演示如何使用.

1.2 Fetch And Add

在某个内存地址存储的值上增加一个值, 下面是段伪代码:

function FetchAndAdd(address location, int inc) {
    int value := *location
    *location := value + inc
    return value
}

C++11标准提供了atomic_fetch_add 前缀的函数

1.3 Test And Set

写新值入内存地址,并返回内存地址之前存放的值, 这可以通过spin技术实现lock函数. 伪码如下:

function TestAndSet(boolean_ref lock) {
    boolean initial = lock
    lock = true
    return initial
}

参考wiki

C++11标准提供了该功能

Author: dean

Created: 2015-12-15 二 23:18

Validate

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值