基本原子操作
来源:互联网 发布:ubuntu安装phpstorm 编辑:程序博客网 时间:2024/05/29 07:32
Table of Contents
- 1. 处理器支持的一系列原子操作
- 1.1. CAS(Compare And Swap/Set)
- 1.1.1. 函数原型
- 1.1.2. 实现逻辑
- 1.1.3. C++11标准库
- 1.2. Fetch And Add
- 1.3. Test And Set
- 1.1. CAS(Compare And Swap/Set)
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 实现逻辑
- 根据传入的参数oldval和内存地址存放的值*reg比较
- 如果相同则让内存地址存放新值
- 如果不同则不做操作
说明此时有竞争的线程抢先修改了内存地址存放的值,因此不做操作
- 如果相同则让内存地址存放新值
- 返回值有两种,因此实现代码也有两种,第一种比较方便因此推荐
- 如果操作成功则返回true,不成功返回false
bool compare_and_swap(int *accum, int *dest, int newval){ if (*accum == *dest) { *dest = newval; return true; } else {//此时有竞争的线程抢先修改了内存地址存放的值,因此不做操作 *accum = *dest; return false; }}
- 或者仅仅返回执行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;}
- 如果操作成功则返回true,不成功返回false
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标准提供了该功能
Created: 2015-12-15 二 23:18
Validate
1 0
- 原子操作基本内容
- 基本原子操作
- 原子操作基本内容计算机操作系统进程
- java原子操作类-基本类型类
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 原子操作
- 【黑马程序员】第六章:Java API
- jstl 的一些随笔
- HDU5599GTW likes tree
- KVO delegation与KVO的区别和优缺点
- android中的ViewTreeObserver
- 基本原子操作
- CSS层叠样式表
- 【Android 学习】之二维码扫描开发(闪光灯功能)
- Python-MySQL summary
- error:loading /system/media/audio/ui/Effect_Tick.ogg
- 一个域名指向一个项目;多个域名指向同一个项目
- imageSlider与XListView的联用
- memset函数实现——string.h库函数
- UI_数据库