c++中的原子操作
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. 自旋锁的实现:boost实现如下,在spinlock_sync.hpp
class spinlock
{
public:
int v_;
public: bool try_lock()
{
int r = __sync_lock_test_and_set( &v_, );
return r == ;
} void lock()
{
for( unsigned k = ; !try_lock(); ++k )
{
//等待一些指令周期
boost::detail::yield( k );
}
} void unlock()
{
__sync_lock_release( &v_ );
}
};
悲观锁和乐观锁
独占锁是一种悲观锁,synchronized就是一种独占锁,它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
CAS操作
    Compare and Swap,比较并操作,CPU指令,在大多数处理器架构,包括IA32、Space中采用的都是CAS指令,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
c++中的原子操作的更多相关文章
- Java学习技术分享:Java中的原子操作
		
学习java需要有一套完整的学习线路,需要有条理性,当下学习java已经有一段时间了,由当初的懵逼状态逐渐好转,也逐渐养成了写技术学习笔记的习惯,今天总结了一下java中的原子操作. 1.Java中的 ...
 - OpenGL中的原子操作需要注意的地方
		
OpenGL中的原子操作需要注意的地方 仔细阅读看画红线的部分
 - Java中的原子操作类
		
转载: <ava并发编程的艺术>第7章 当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可 ...
 - 【Java并发】Java中的原子操作类
		
综述 JDK从1.5开始提供了java.util.concurrent.atomic包. 通过包中的原子操作类能够线程安全地更新一个变量. 包含4种类型的原子更新方式:基本类型.数组.引用.对象中字段 ...
 - 【并发编程】Java中的原子操作
		
什么是原子操作 原子操作是指一个或者多个不可再分割的操作.这些操作的执行顺序不能被打乱,这些步骤也不可以被切割而只执行其中的一部分(不可中断性).举个列子: //就是一个原子操作 int i = 1; ...
 - Java中的原子操作
		
Java中的原子操作 原子性:指该操作不能再继续划分为更小的操作. Java中的原子操作包括: 除long和double之外的基本类型的赋值操作 所有引用reference的赋值操作 java.con ...
 - java中的原子操作类AtomicInteger及其实现原理
		
/** * 一,AtomicInteger 是如何实现原子操作的呢? * * 我们先来看一下getAndIncrement的源代码: * public final int getAndIncremen ...
 - Redis 中的原子操作(1)-Redis 中命令的原子性
		
Redis 如何应对并发访问 Redis 中处理并发的方案 原子性 Redis 的编程模型 Unix 中的 I/O 模型 thread-based architecture(基于线程的架构) even ...
 - Redis中的原子操作(2)-redis中使用Lua脚本保证命令原子性
		
Redis 如何应对并发访问 使用 Lua 脚本 Redis 中如何使用 Lua 脚本 EVAL EVALSHA SCRIPT 命令 SCRIPT LOAD SCRIPT EXISTS SCRIPT ...
 - Redis 中的原子操作(3)-使用Redis实现分布式锁
		
Redis 中的分布式锁如何使用 分布式锁的使用场景 使用 Redis 来实现分布式锁 使用 set key value px milliseconds nx 实现 SETNX+Lua 实现 使用 R ...
 
随机推荐
- Python脚本控制的WebDriver 常用操作 <六> 打印当前页面的title及url
			
下面将使用WebDriver来答应浏览器页面的title和访问的地址信息 测试用例场景 测试中,访问1个页面然后判断其title是否符合预期是很常见的1个用例: 假设1个页面的title应该是'hel ...
 - opengl基础学习专题 (三) 多边形绘制的几种样式
			
题外话 聪明人之所以不会成功,是由于他们缺乏坚韧的毅力. ——艾萨克·牛顿(1643年1月4日—1727年3月31日)英国 也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向 ...
 - ToolBar存档
			
上图是将本阶段要完成的结果画面做了标示,结合下面的描述希望大家能明白. colorPrimaryDark(状态栏底色):在风格 (styles) 或是主题 (themes) 里进行设定. App ba ...
 - android开发系列之由ContentValues看到的
			
这本篇博客里面我想重点来分析一下ContentValues的源码以及它里面涉及到的继承接口Parcelabel,还有HashMap的源码. 相信使用过android里面数据库操作的朋友对于Conten ...
 - iOSReachability判断网络连接状态
			
// // NetStateManage.h // // Created by miniu on 15/11/24. // Copyright © 2015年 mini. All rights ...
 - NSKeyValueObserving(KVO)
			
NSKeyValueObserving非正式协议定义了一种机制,它允许对象去监听其它对象的某个属性的修改. 我们可以监听一个对象的属性,包括简单属性,一对一的关系,和一对多的关系.一对多关系的监听者会 ...
 - 关于自定义的NavigationBar
			
系统的NavigationBar局限太大,而且现在我要做的navigationBar需要四个按钮,一个Label,一个ImageView,所以不能用系统默认的. 刚刚咨询了一个高手,她的建议是,将系统 ...
 - 在ASP.NET中实现OAuth2.0(一)之了解OAuth
			
1.什么是OAuth2.0 是一个开放授权标准,允许用户让第三方应用访问该用户在某一个网站或平台上的私密资源(如照片.视频.联系人等),而无须将用户名和密码提供给第三方应用 2.OAuth2.0授权模 ...
 - [转]Ubuntu中root用户和user用户的相互切换
			
[转]Ubuntu中root用户和user用户的相互切换 http://www.cnblogs.com/weiweiqiao99/archive/2010/11/10/1873761.html Ubu ...
 - HashSet<T>类
			
HashSet<T>类主要是设计用来做高性能集运算的,例如对两个集合求交集.并集.差集等.集合中包含一组不重复出现且无特性顺序的元素. HashSet<T>的一些特性如下: 1 ...