`
f002489
  • 浏览: 270919 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

程序员该怎么用Atomic操作?

    博客分类:
  • C
  • C++
 
阅读更多
http://blog.csdn.net/rain_qingtian/article/details/11020827

原子性,也就是要么全部做完,要么全部不做
多进程(线程)访问资源时,能够确保所有其他的进程(线程)都不在同一时间内访问相同的资源。原子操作(atomic operation)是不需要同步,这是Java多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。通常所说的原子操作包括对非long和double型的primitive进行赋值,以及返回这两者之外的primitive。之所以要把它们排除在外是因为它们都比较大,而JVM的设计规范又没有要求读操作和赋值操作必须是原子操作(JVM可以试着去这么作,但并不保证)。不过如果你在long或double前面加了volatile,那么它就肯定是原子操作了。



一般情况下程序员不需要跟CPU提供的原子操作直接打交道,所以只需要选择语言或者平台提供的atomic API即可。而且使用封装好了的API还有一个好处是它们常常还提供了诸如compare_and_swap,fetch_and_add这样既有读又有写的较复杂操作的封装。
常见的API如下:
Windows上InterlockedXXXX的API
GNU/Linux上linux kernel中atomic_32.h
GCC中的Atomic Builtins (__sync_fetch_and_add()等)
Java中的java.util.concurrent.atomic
C++0x中的atomic operation
Intel TBB中的atomic operation


这种情况下我们就需要对x++这样的操作加锁(例如Pthread中的mutex)以保证同步,或者使用一些提供了atomic operations的库(例如Windows API中的atomic库,Linux内核中的atomic.h,Java concurrent库中的Atomic Integer,C++0x中即将支持的atomic_int等等,这些库会利用CPU提供的硬件机制做一层封装,提供一些保证了原子性的API)。
分享到:
评论
1 楼 f002489 2016-12-07  
C++中对共享数据的存取子啊并发条件下可能会引起data race的undifined行为,需要限制并发程序以某种特定的顺序执行,有两种方式:使用mutex保护共享数据,原子操作:针对原子类型操作要不一步完成,要么不做,不可能出现操作一半被切换CPU,这样防止由于多线程指令交叉执行带来的可能错误。非原子操作下,某个线程可能看见的是一个其它线程操作未完成的数据。

相关推荐

    atomic_ops.pdf

    这个初始化操作是原子的,意味着如果在运行时使用初始化器,为了保证另一个线程能够正确读取用`atomic_read`得到的值,需要在读取之前加上适当的内存屏障(memory barrier)。这里的内存屏障可以是隐式的,也可以是...

    boost_atomic.7z

    其中,`boost::atomic`模块是实现线程安全的关键组件,它为程序员提供了在不同平台上进行原子操作的能力。本文将深入探讨`boost_atomic`库的核心概念、使用方法以及其实现原理。 `boost_atomic`库主要为开发者提供...

    程序员必备600英语单词

    **Atomic** 在计算机科学中指的是一个操作或指令,它要么完全完成,要么完全不发生。原子操作在并发编程中非常重要,可以避免多个线程同时修改共享资源时出现问题。 #### 15. Attribute (属性 属性、特性) **...

    多线程程序中的原子操作

    3. **程序员该如何使用原子操作?** 通过分析这些问题,我们将更好地理解原子操作的本质及其在实际编程中的应用。 #### 二、多线程环境中对变量的读写操作是否是原子的? 为了彻底理解这个问题,我们需要从硬件...

    程序员英语单词册

    ### 程序员英语词汇解析 #### 一、词汇概览 为了更好地与国际接轨,程序员必须掌握一定的英语词汇,特别是与计算机科学和技术相关的专业术语。这些词汇不仅有助于理解技术文档、源代码注释,还能提升个人的技术...

    阿里java高级程序员面试题

    阿里Java高级程序员面试题涵盖了广泛的知识点,旨在评估候选人在Java编程、算法、并发处理、设计模式、数据库、网络协议以及阿里巴巴集团特定的技术栈等方面的掌握程度。以下是对这些面试题可能涉及的重要知识点的...

    程序员英语手册

    Atomic Operation 原子操作** - **定义**:一次完整的操作,要么全部成功,要么全部失败。 - **应用场景**:并发编程、多线程编程。 **55. Attribute 特性、属性** - **定义**:描述实体或类特性的信息。 - **应用...

    中兴通java程序员面试题(高)

    Java程序员在面试中可能会遇到各种复杂的问题,这些题目旨在测试候选人的基础知识、编程技能以及对Java生态系统的理解。以下是对给定题目的一些详细解释: 1. **异常分类**:Java中的异常分为检查型异常(Exception...

    atomicops_internals_x86_gcc.rar_This Is It

    该压缩包中的"atomicops_internals_x86_gcc.c"文件很可能是GCC编译器针对x86平台实现的原子操作的内部源代码。GCC(GNU Compiler Collection)是一个广泛使用的开源编译器套件,它提供了对C、C++、Objective-C、...

    15 原子性轻量级实现—深入理解Atomic与CAS.pdf

    Java并发编程是多线程环境下确保程序正确性的关键。在这个领域,"原子性"是并发控制的三大特性之一,另外两个是"可见性"和"有序性"。...了解和熟练使用这些工具,对于成为一名合格的Java并发程序员至关重要。

    MFC教程lesson 13-CArchive&IO操作.rar

    在MFC中,`CArchive`主要用于实现文件的输入/输出操作,它允许开发者以一种面向对象的方式来处理文件数据,而不是直接使用低级别的文件操作函数。`CArchive`类的工作方式类似于流,它可以将数据写入到一个档案文件...

    程序员常用600词汇.docx

    程序员常用600词汇 ...Atomic 是指某个操作是不可分割的,即它是一个原子操作。这意味着这个操作要么完全执行,要么不执行。例如,在数据库中的一些操作可能是原子的,以确保数据的一致性。 ...(以下省略)

    CAS学习手册-JAVA程序员必备

    CAS机制是JAVA程序员处理并发问题的一种重要工具,它提供了无锁的原子操作,但在某些场景下,可能需要结合其他同步策略如`synchronized`或`Lock`来应对复杂的并发控制需求。理解并熟练应用CAS,可以提升多线程程序...

    atomic64.rar_Linux/Unix编程_Unix_Linux_

    在"atomic64.h"头文件中,可能会定义一系列宏和函数,用于封装这些操作,使得程序员可以方便地在代码中使用。这些接口可能包括`atomic64_read()`, `atomic64_set()`, `atomic64_add()`, `atomic64_sub()`, `atomic64...

    黑马程序员java面试宝典 完整版PDF.rar

    《黑马程序员Java面试宝典》是一本专门为Java开发者准备的面试指南,包含了广泛而深入的Java技术知识,以及面试过程中可能会遇到的各种问题。这本书的完整版PDF提供了丰富的学习材料,帮助求职者提升自己的技术水平...

    程序员英语词汇.docx

    - **操作**: 通常使用等号 (=) 来表示赋值操作。 #### 13. 关联式容器 (Associative Container) - **定义**: 一种数据容器,如哈希表或树,其中元素是基于键进行组织的。 - **应用场景**: 在需要快速查找的情况下...

    程序员英语单词册1

    程序员英语单词册1 在计算机科学和信息技术领域,英语单词册1为程序员提供了一个系统的英语词汇学习指南。以下是从文件中提取的知识点: 1. 应用程式相关知识点: * Application:应用程式、应用程序 * ...

    Java多线程atomic包介绍及使用方法

    Java 多线程 atomic 包是 Java 并发编程中的一种重要工具,自从 JDK 1.5 开始,Java 就提供了 java.util.concurrent.atomic 包,方便程序员在多线程环境下,无锁的进行原子操作。 atomic 包的出现极大地简化了多线程...

    程序员工作中常用英语词汇.doc

    14. **Atomic**: 不可分割的 - 指操作不可被中断,必须一次性完成,常用于多线程编程中的原子操作。 15. **Attribute**: 属性 - 描述对象特征的信息,例如HTML元素的属性或数据库中的字段。 16. **Audio**: 音讯 -...

    每个程序员都应该知道的97件事

    - 介绍了几种常见的解决方法,如锁机制(Locks)、原子操作(Atomic Operations)等,这些技术可以帮助开发者安全地管理共享资源。 - 提醒开发者在设计系统时要尽量减少共享资源的使用,转而采用更安全的设计模式...

Global site tag (gtag.js) - Google Analytics