i++是否原子操作】的更多相关文章

Linux的原子操作与同步机制   .进程1执行完“mov eax, [count]”后,寄存器eax内保存了count的值0.此时,进程2被调度执行,抢占了进程1的CPU的控制权.进程2执行“count++;”的汇编代码,将累加后的count值1写回到内存.然后,进程1再次被调度执行,CPU控制权回到进程1.进程1接着执行,计算count的累加值仍为1,写回到内存.虽然进程1和进程2执行了两次“count++;”操作,但是count实际的内存值为1,而不是2! )从内存将count的数据读取到…
原文链接:王旭博客 » C# 使用Interlocked进行原子操作 什么是原子操作? 原子(atom)本意是"不能被进一步分割的最小粒子",而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" .在C#中有多个线程同时对某个变量进行操作的时候,我们应该使用原子操作,防止多线程取到的值不是最新的值. 例如:int result = 0;多线程A正在执行 result(0)+1多线程B同时执行 result(0)+1 那么最终result…
我在之前一篇博文<漫谈C++11 Thread库之使写多线程程序>中,着重介绍了<thread>头文件中的std::thread类以及其上的一些基本操作,至此我们动手写多线程程序已经基本没有问题了.但是,单线程的那些"坑"我们仍还不知道怎么去避免. 多线程存在的问题 多线程最主要的问题就是共享数据带来的问题.如果共享数据都是只读的,那么没问题,因为只读操作不会影响到数据,更不会涉及对数据的修改,所以所有线程都会获得同样的数据.但是,当一个或多个线程要修改共享数据…
说明:内核版本号为3.10.101 一.ARM架构中的原子操作实现 在原子操作(一)中我们已经提到,各个架构组织为“复仇者”联盟,统一了基本的原子变量操作,这里我们就拿atomic_dec(v)来看看通天ARM的实现. 首先是atomic_dec(v)原子减一操作的宏定义.这个宏的定义在文件arch/arm/include/asm/atomic.h中: #define atomic_dec(v) atomic_sub(1, v) 对于ARM架构不同的版本,stomic_sub(i,v)的实现是不…
锁 锁以及信号量对大部分人来说都是非常熟悉的,特别是常用的mutex.锁有很多种,互斥锁,自旋锁,读写锁,顺序锁,等等,这里就只介绍常见到的, 互斥锁 这个是最常用的,win32:CreateMutex-WaitForSingleObject-ReleaseMutex,linux的pthread_mutex_lock-pthread_mutex_unlock,c#的lock和Monitor,java的lock,这些都是互斥锁.互斥锁的作用大家都知道,是让一段代码同时只能有一个线程运行, 自旋锁…
package com; import sun.misc.Unsafe; import java.lang.reflect.Field; /** * Created by yangyu on 16/11/24. */ public class TestUnsafe { public static void main(String[] args) { Node node = new Node(); /** * 通过CAS方法更新node的next属性 * 原子操作 */ boolean flag…
volatile关键字 volatile是一个特殊的修饰符,只有成员变量才能使用它,与Synchronized及ReentrantLock等提供的互斥相比,Synchronized保证了Synchronized同步块中变量的可见性,而volatile则是保证了所修饰变量的可见性.可见性指的是在一个线程中修改变量的值以后,在其他线程中能够看到这个值(在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其它线程是透明的(不可见)).因为volatile只是保证了同一个变量在多线程中的可见性…
gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作.其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub (type *ptr, type value, ...) type __sync_fetch_and_or (type *ptr, type value, ...) type __sync_fetch_and_and (t…
i++是否原子操作 不是原子操作.理由: 1.i++分为三个阶段: 内存到寄存器 寄存器自增 回内存 这三个阶段中间都可以被中断分离开.  2.++i首先要看编译器是怎么编译的, 某些编译器比如VC在非优化版本中会编译为以下汇编代码: __asm {         moveax,  dword ptr[i]         inc eax         mov dwordptr[i], eax } 这种情况下,必定不是原子操作,不加锁互斥是不行的. 假设加了优化参数,那么是否一定会编译为“i…
php原子操作,文件锁flock,数据库事务 php没有继承posix标准支持的unix锁,只封装了一个linux系统调用flock(信号量也能做成锁),按理也是可以使用锁机制的,虽然效率低一点.php脚本是运行在fastcgi容器中,而fastcgi是多进程的,所以如果php程序访问了临界资源,势必造成程序结果的不正确性.估计还要考虑下fastcgi容器的问题------------------------------------问题描述:黑客用的工具刷我们的后台取消订单时会有退款,黑客并发取…
上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是否运行出错.这也非常类似于统计一个网站每天有多少用户登录,每个用户登录用一个线程模拟,线程运行时会将一个表示计数的变量递增.程序在最后输出计数的值表示有今天多少个用户登录,如果这个值不等于我们启动的线程个数,那显然说明这个程序是有问题的.整个程序代码如下: #include <stdio.h> #…
原子操作这是Java多线程编程的老生常谈了.所谓原子操作是指不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程). 当然JS是单线程的,所以不存在线程打断这么一说,我只是从Java中借引了这么一个概念.如果一段JS代码在执行过程中没有未知操作被引入,那么这段代码就是100%可控和安全的,这就是原子操作.反之非原子操作可能会因为外界操作的引入导致代码变得难以控制而产生隐晦的bug. 下面举例说明非原子操作可能会带来的问…
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_…
转载自: http://blog.csdn.net/yockie/article/details/8838686 所谓的原子操作,取的就是“原子是最小的.不可分割的最小个体”的意义,它表示在多个线程访问同一个全局资源的时候,能够确保所有其他的线程都不在同一时间内访问相同的资源.也就是他确保了在同一时刻只有唯一的线程对这个资源进行访问.这有点类似互斥对象对共享资源的访问的保护,但是原子操作更加接近底层,因而效率更高. 在以往的C++标准中并没有对原子操作进行规定,我们往往是使用汇编语言,或者是借助…
和许多多线程并行问题一样,CUDA也存在互斥访问的问题,即当一个线程改变变量X,而另外一个线程在读取变量X的值,执行原子操作类似于有一个自旋锁,只有等X的变量在改变完成之后,才能执行读操作,这样可以保证每一次读取的都是最新的值. 在kernel 程序中,做统计累加,都需要使用原子操作:atomicAdd(); 原子操作很明显的会影响程序性能,所以可以的话,尽可能避免原子操作. CUDA原子操作API: C.1.1  atomicAdd()int atomicAdd(int* address, i…
一.添写至一个文件 考虑一个进程,它要将数据添加到一个文件尾端.早期的UNIX系统并不支持open的O_APPEND选项,所以程序被编写成下列形式: ) < ) /* position to EOF */ err_sys( "lseek error" ); ) != ) /* and write */ err_sys( "write error" ); 对单个进程而言,这段程序能正常工作,但若有多个进程同时使用这种方法将数据添加到同一文件,则会产生问题. 假定…
++和--都不是原子操作:都包含三条机器指令 http://sroply.blog.163.com/blog/static/17092651920106117251539/…
所谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念. 原子操作需要硬件的支持,因此是架构相关的,其API和原子类型的定义都定义在内核源码树的include/asm/atomic.h文件中,它们都使用汇编语言实现,因为C语言并不能实现这样的操作. 原子操作主要用于实现资源计数,很多引用计数(refcnt)就是通过原子操作实现的.原子类型定义如下:typedef struct…
转: http://www.blogjava.net/xylz/archive/2010/07/03/325168.html 在这个小结里面重点讨论原子操作的原理和设计思想. 由于在下一个章节中会谈到锁机制,因此此小节中会适当引入锁的概念. 在Java Concurrency in Practice中是这样定义线程安全的: 当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替运行,并且不需要额外的同步及在调用方代码不必做其他的协调,这个类的行为仍然是正确的,那么这个类就是线程安…
转:http://www.blogjava.net/xylz/archive/2010/07/02/325079.html 在这一部分开始讨论数组原子操作和一些其他的原子操作. AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray的API类似,选择有代表性的AtomicIntegerArray来描述这些问题. int get(int i) 获取位置 i 的当前值.很显然,由于这个是数组操作,就有索引越界的问题(IndexOutOfBoun…
转:http://www.blogjava.net/xylz/archive/2010/07/01/324988.html 从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始).很多情况下我们只是需要一个简单的.高效的.线程安全的递增递减方案.注意,这里有三个条件:简单,意味着程序员尽可能少的操作底层或者实现起来要比较容易:高效意味着耗用资源要少,程序处理速度要快:线程安全也非常重要…
http://blog.sina.com.cn/s/blog_6f5b220601013zw3.html 非常好的原子操作,不用加锁:__sync_fetch_and_add GCC 提供的原子操作 gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作. 其声明如下: type __sync_fetch_and_add (type *ptr, type value, ...) type __sync_fetch_and_sub (type *ptr…
测试结论是发现C++11原子操作在性能上,比以往用到的InterlockedIncrement或__sync_add_and_fetch性能上慢了1倍左右. 另外补充一点,在对原子变量进行比较的时候,最好是引用它操作后的返回值,而不要直接用原子变量进行比较,比如: 下面是测试过程以及代码 std::atomic<; long v = ++g_data; ) { dosomething(); } //不要用下面的方式,可能某个线程已将g_data原子的值设置为了1000,而引起不只一个线程执行下面…
一.线程同步中的一些概念 1.1临界区(共享区)的概念 在多线程的环境中,可能需要共同使用一些公共资源,这些资源可能是变量,方法逻辑段等等,这些被多个线程共用的区域统称为临界区(共享区),临界区的资源不是很安全,因为线程的状态是不定的,所以可能带来的结果是临界区的资源遭到其他线程的破坏,我们必须采取策略或者措施让共享区数据在多线程的环境下保持完成性不让其受到多线程访问的破坏. 1.2基元用户模式 基元用户模式是指使用cpu的特殊指令来调度线程,所以这种协调调度线程是在硬件中进行的所以得出了它第一…
上一篇<多线程第一次亲密接触 CreateThread与_beginthreadex本质区别>中讲到一个多线程报数功能.为了描述方便和代码简洁起见,我们可以只输出最后的报数结果来观察程序是否运行出错.这也非常类似于统计一个网站每天有多少用户登录,每个用户登录用一个线程模拟,线程运行时会将一个表示计数的变量递增.程序在最后输出计数的值表示有今天多少个用户登录,如果这个值不等于我们启动的线程个数,那显然说明这个程序是有问题的.整个程序代码如下: #include <stdio.h> #…
前面写了一个多线程报数的功能,为了描述方便和代码简洁起见,只输出最后的报数结果来观察程序运行结果.这非常类似一个网站的客户访问统计,每个用户登录用一个线程模拟,线程运行时将一个表示计数的变量递增.程序在最后输出这个计数的值表示今天有多少用户登录.如果这个值不等于我们启动的线程个数,那这个程序就是有问题的. 为了放大问题,能清楚的看到问题,把线程数设置为50,程序执行200遍,看程序执行的结果: #include <stdio.h> #include <process.h>//_be…
Java 类库中包括很多实用的"基础模块"类.通常,我们应该优先选择重用这些现有的类而不是创建新的类.:重用能减少开发工作量.开发风险(由于现有类都已经通过測试)以及维护成本.有时候,某个线程安全类能支持我们须要的全部操作,但很多其它的时候,现有的类仅仅能支持大部分的操作,此时就须要在不破坏线程安全的情况下加入一个新的操作. 如果我们须要一个线程安全的链表,他须要提供一个原子的"若没有则加入(Put-If-Absent)"的操作.同步的 List 类已经实现了大部分…
深入分析Volatile的实现原理 引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的"可见性".可见性的意思是当一个线程改动一个共享变量时,另外一个线程能读到这个改动的值. 它在某些情况下比synchronized的开销更小.本文将深入分析在硬件层面上Inter处理器是怎样实现Volatile的,通过深入分析能帮助我们正确的使用Volatile变量. 术语定义 术…
翻译一篇:HBase MVCC and built-in Atomic Operations 作者:Lars Hofhansl HBase 有一些特殊的原子操作: checkAndPut, checkAndDelete - 检查列值作为执行 put 和 delete 的前置条件,检查成功则执行. Increment, Append - 对一个列 value 的原子操作,将一个整数值增加,或者在值的尾部附加(译注:我理解是非整数值,比如 String) checkAndPut 和 checkAnd…
本文主要为读论文Scalable Read-mostly Synchronization Using Passive Reader-Writer Locks的记录. 并将其在JOS上实现.其中包括lapic原理,IPI 实现. 本文中支持的新特性: 支持原子操作 支持读写锁 支持针对单一核心IPI 支持PRWLock Github : https://github.com/He11oLiu/JOS 论文阅读记录 研究背景 单核性能提升遇到瓶颈 转向多核提升性能 单核主要为计算密集型模型,多核主要…