原子

016_linux驱动之_原子操作

不打扰是莪最后的温柔 提交于 2019-12-26 11:34:23
原子操作 原子操作指的是在执行过程中不会被别的代码路径所中断的操作。 常用原子操作函数举例: atomic_t v = ATOMIC_INIT(0); //定义原子变量v并初始化为0 atomic_read(atomic_t *v); //返回原子变量的值 void atomic_inc(atomic_t *v); //原子变量增加1 void atomic_dec(atomic_t *v); //原子变量减少1 int atomic_dec_and_test(atomic_t *v); //自减操作后测试其是否为0,为0则返回true,否则返回false。 016_linux驱动之_原子操作引用,人间的写得挺好的 Linux内核驱动之原子变量 atomic_inc 原子操作 来源: CSDN 作者: 陆小果哥哥 链接: https://blog.csdn.net/xiaoguoge11/article/details/103708640

并发案例:如何保证统计变量的原子性

给你一囗甜甜゛ 提交于 2019-12-25 16:29:54
文章目录 引言 i++ 数据不一致案例分析 案例描述 问题分析 解决办法 AtomicInteger 原子类概述 案例描述 问题分析 延伸测试 启示录 引言 i++ 这个简单的语句,想必大家都不陌生,但是在多线程环境下,如果 i 是一个全局共享变量,那么它还能正确地按顺序累加吗?这就是本文要介绍的内容,如何保证统计变量的原子性。 其实, i++ 是由 “读取-修改-写入” 三个操作序列组成的复合操作,应该保证它们的原子性,否则就会出现数据不一致的情况。本文是根据笔者几年前的一篇旧文整理的,那时刚入行两年,并发编程经验几乎为零。 i++ 数据不一致案例分析 案例描述 笔者早年参与的一个项目中,需要对一个 http 请求请求结果进行统计,得到失败和成功的请求总数。一起合作的同事定义了两个全局共 来源: CSDN 作者: 毕小宝 链接: https://blog.csdn.net/wojiushiwo945you/article/details/103693060

关于BSSE校正

你。 提交于 2019-12-23 23:13:43
本文转载自: http://blog.sina.com.cn/zhangsummer183 计算A、B分子间的弱相互作用能时,一般不能简单地通过E_interaction = E_AB - E(A) - E(B)来计算,因为E_AB能量相对于E(A) + E(B)的降低来自两方面,一方面是真实的A、B分子间的相互作用能,这是我们要求的;另一方面来自于A、B分子的基函数在复合物体系中重叠,相当于增大了复合物的基组而使E(AB)能量降低(严格来说前提是所用的理论方法是基于变分原理的),这个部分贡献如果也掺入E_interaction,则高估了相互作用能(即实际上结合能没有算出来的那么负),所以要去掉,它称为Basis Set Superposition Error(BSSE)。所以双分子的相互作用能应该表述为E_interaction = E_AB - E(A) - E(B) + E_BSSE。对于弱相互作用,E_BSSE所占E_interaction的比例往往不小,甚至超过它,如果不进行校正,可能正负号都不对。 基组越小,单体间相互作用越弱则E_BSSE越大。E_BSSE会随基组趋于完备而逐渐减小至0,给基组加上弥散函数能有效减小E_BSSE。对于氢键复合物,由于相互作用不算很弱,所以用了带弥散的中上等基组后,不做BSSE校正无妨。而pi-pi相互作用,即便用了aug-cc

JUC 基础内容概述

半城伤御伤魂 提交于 2019-12-23 10:50:29
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Concurrent Programming in Java 的作者 Doug Lea 编写了一个极其优秀的、免费的并发实用程序包,它包括并发应用程序的锁、互斥、队列、线程池、轻量级任务、有效的并发集合、原子的算术操作和其它基本构件。我们一般称这个包为 J.U.C。 1. JUC概况 以下是Java JUC包的主体结构: Atomic : AtomicInteger Locks : Lock, Condition, ReadWriteLock Collections : Queue, ConcurrentMap Executer : Future, Callable, Executor Tools : CountDownLatch, CyclicBarrier, Semaphore 2. 原子操作 多个线程执行一个操作时,其中任何一个线程要么完全执行完此操作,要么没有执行此操作的任何步骤,那么这个操作就是原子的。出现原因: synchronized的代价比较高。 以下以AtomicInteger为例: int addAndGet(int delta):以原子方式将给定值与当前值相加。 实际上就是等于线程安全版本的i =i+delta操作。 boolean compareAndSet(int expect,

跨越边界: Lisp 之美

﹥>﹥吖頭↗ 提交于 2019-12-23 07:06:34
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Lisp 长久以来一直被视为伟大的编程语言之一。其漫长的发展过程(接近五十年)中引发的追随狂潮表明:这是一门非同凡响的语言。在 MIT,Lisp 在所有程序员的课程中占了举足轻重的地位。像 Paul Graham 那样的企业家们将 Lisp 卓越的生产力用作他们事业成功起步的推动力。但令其追随者懊恼万分的是,Lisp 从未成为主流编程语言。作为一名 Java? 程序员,如果您花一点时间研究 Lisp 这座被人遗忘的黄金之城,就会发现许多能够改进编码方式的技术。 我最近第一次完成了马拉松赛跑,我 发现跑步比我预想的更有价值。我跑了 26.2 英里,通过该步骤,我开始认为这是对身体非常有益的简单活动。一些语言给了我类似的感觉,如 Smalltalk 和 Lisp。对 Smalltalk 来说,引发类似感觉的是对象;Smalltalk 中的一切内容都是在处理对象和消息传递。对于 Lisp 来说,这个至为重要的步骤更为简单。这门语言完全由列表组成。但不要被这个简单的假相所欺骗。这门有着 48 年历史的语言具有难以置信的强大功能和灵活性,这是 Java 语言所不能企及的。 第一次和 Lisp 打交道时,我还是在校大学生,但这次不是很顺利。因为我拼命地想把 Lisp 编入到熟悉的过程化范例中,而不是在 Lisp

Java并发编程之原子操作类

喜你入骨 提交于 2019-12-21 14:18:56
什么是原子操作类 当更新一个变量的时候,多出现数据争用的时候可能出现所意想不到的情况。这时的一般策略是使用synchronized解决,因为synchronized能够保证多个线程不会同时更新该变量。然而,从jdk 5之后,提供了粒度更细、量级更轻,并且在多核处理器具有高性能的原子操作类。因为原子操作类把竞争的范围缩小到单个变量上,这可以算是粒度最细的情况了。 原子操作类相当于泛化的volatile变量,能够支持原子读取-修改-写操作。比如AtomicInteger表示一个int类型的数值,提供了get和set方法,这些volatile类型的变量在读取与写入上有着相同的内存语义。原子操作类共有13个类,在java.util.concurrent.atomic包下,可以分为四种类型的原子更新类:原子更新基本类型、原子更新数组类型、原子更新引用和原子更新属性。 下面介绍这各种原子操作类 1 原子更新基本类型:使用原子方式更新基本类型 AtomicBoolean:原子更新布尔变量 AtomicInteger:原子更新整型变量 AtomicLong:原子更新长整型变量 2 原子更新数组:通过原子更新数组里的某个元素 AtomicIntegerArray:原子更新整型数组的某个元素 AtomicLongArray:原子更新长整型数组的某个元素 AtomicReferenceArray

铷原子时钟基准介绍

走远了吗. 提交于 2019-12-21 04:04:26
铷原子时钟基准介绍 在科技的快速发展下,时频设备也在不断进步,来满足各领域的需要。时频设备已经不只是简单的计时了,还有着安全防护、继电器报警、统一时间等作用。在一些授时要求相对简单的行业,普通的时频设备就可以满足,但在军事、电力、科研机构、航空、航天等领域,就需要高精度时钟设备,内置铷原子时钟进行守时,并且以铷原子时钟提供的时间信息为基准。 铷原子钟守时精度较高,铷原子钟是由铷量子部分和压控晶体振荡器组成,误差信号送回到压控晶体振荡器,对频率进行调节使频率锁定在铷原子特有的能级,跃迁到所对应的频率上。铷原子钟是由单片机电路、伺服电路、微波倍频电路、频率调制、倍频综合电路几个模块组成。铷钟的基本工作原理与铯钟相似,均利用能级跃迁的谐振频率作为基准。原子是围绕在原子核周围不同电子层的能量差,来吸收或释放电磁能量的,当原子从一个高“能量态”跃迁至低的“能量态”时,它便会释放电磁波。这种电磁波特征频率是固定的,这也就是人们所说的共振频率。通过以这种共振频率为节拍器,原子钟可以来测定时间。 在时频设备使用过程中,需要接收卫星信号并进行实时对时以保证时间准确,但是有些时频设备在使用中,因使用场所的限制不能一直接收卫星信号,但如果接收不到卫星信号,随着时间的推移设备就会存在一定误差,从而导致时间不准确,所以在这种情况下时频设备内部会配置温补晶振、恒温晶振、铷原子钟等

JAVA CAS原理深度分析

点点圈 提交于 2019-12-20 02:59:47
CAS CAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。 本文先从CAS的应用说起,再深入原理解析。 CAS应用 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 非阻塞算法 (nonblocking algorithms) 一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。 现代的CPU提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。 拿出AtomicInteger来研究在没有锁的情况下是如何做到数据正确性的。 private volatile int value; 首先毫无以为,在没有锁的机制下可能需要借助volatile原语,保证线程间的数据是可见的(共享的)。 这样才获取变量的值的时候才能直接读取。 public final int get() { return value; } 然后来看看++i是怎么做到的。 public final int incrementAndGet() { for (;;) { int current = get(); int next = current

JAVA CAS原理深度分析

泪湿孤枕 提交于 2019-12-20 02:59:07
参考文档: http://www.blogjava.net/xylz/archive/2010/07/04/325206.html http://blog.hesey.net/2011/09/resolve-aba-by-atomicstampedreference.html http://www.searchsoa.com.cn/showcontent_69238.htm http://ifeve.com/atomic-operation/ http://www.infoq.com/cn/articles/java-memory-model-5 java.util.concurrent包完全建立在CAS之上的,没有CAS就不会有此包。可见CAS的重要性。 CAS CAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。 本文先从CAS的应用说起,再深入原理解析。 CAS应用 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 非阻塞算法 (nonblocking algorithms) 一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。 现代的CPU提供了特殊的指令

CAS--JAVA为什么选择它,如何解析并实现它?

纵饮孤独 提交于 2019-12-20 02:44:38
这边参考的是: A-B-A问题: https://hesey.wang/2011/09/resolve-aba-by-atomicstampedreference.html CAS解析: https://blog.csdn.net/v123411739/article/details/79561458 https://www.cnblogs.com/onlywujun/articles/3529572.html 牛人: http://ifeve.com/ 首先CAS 是是什么? Compare and Swap,是比较并交换的意思。 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。 它是一种非阻塞型的算法,一个线程的失败或者挂起不应该影响其他线程的失败或挂起的算法。 现代的CPU提供了特殊的指令,可以自动更新共享数据,而且能够检测到其他线程的干扰,而 compareAndSet() 就用这些代替了锁定。 这边拿AtomicInteger来研究在没有锁的情况下是如何做到数据正确性的。 private volatile int value; 在没有锁的机制下可能需要借助volatile原语,保证线程间的数据是可见的(共享的)。 这样在获取变量的值的时候才能直接读取。 public final int