原子类型

http://book.51cto.com/art/201205/336658.htm

10.1.2  原子类型

前面我们看到,对于单线程上下文来说,我们可以对整型值简单地使用--和++。但是对于多线程,我们需要使用操作系统/架构原语。这种方式的缺点是即使我们将差异性抽象到一个公共的函数,例如integer_increment中,我们也要时时记住对某个整型值的所有原子操作都必须以该公共函数来完成。然而忘记其中之一是很容易的事情,一旦出现了这种情况,你就可能在应用程序中遭遇一个竞争条件,并且这种东西非常难于诊断。

C++通过允许用户自定义类型和内建类型具有相同的"外观",而支持语法的一致性。那么,为什么不让原子类型从任何方面看起来都跟内建类型一样呢(除了它们的操作是原子的之外)?没有理由不这样做,并且,实际上实现起来也相当简单:1

程序清单10.1

  1. class atomic_integer
  2. {
  3. public:
  4. atomic_integer(int value)
  5. : m_value(value)
  6. {}
  7. // 操作
  8. public:
  9. atomic_integer volatile &operator ++() volatile
  10. {
  11. atomic_increment(&m_value);
  12. return *this;
  13. }
  14. const atomic_integer volatile operator ++(int) volatile
  15. {
  16. return atomic_integer(atomic_postincrement(&m_value));
  17. }
  18. atomic_integer volatile &operator —() volatile;
  19. const atomic_integer volatile operator —(int) volatile;
  20. atomic_integer volatile &operator +=(value_type const &value) volatile
  21. {
  22. atomic_postadd(&m_value, value);
  23. return *this;
  24. }
  25. atomic_integer volatile &operator -=(value_type const &value) volatile;
  26. private:
  27. volatile int m_value;
  28. };

这是C++可以使线程编程更容易更简单的领域。然而,关于整型值的自然语义到底有多少应该被该类提供的问题仍然有待推敲。上面的代码展示了在给出原子整型操作的库函数的前提下实现递增/递减以及加减运算是多么的简单。然而,乘法、除法、逻辑操作、移位运算以及另外一些操作则要复杂得多,并且,大多数的原子整型库并不提供这些操作。如果你的代码确实需要它们的话,这就不关我的事了。这种时候,作者往往可以扬长而去,并堂而皇之地说,"这些东西作为一个练习留给读者"。

Boost的原子操作组件使用的正是这种途径:提供atomic_count类型的平台相关的版本,atomic_count仅提供++和--操作(atomic_increment/atomic_decrement)以及隐式转换(atomic_read),因此,如果你决定避开过于复杂的东西,大可心安理得,因为你并不是惟一这么做的人。

时间: 2024-10-13 23:06:22

原子类型的相关文章

深入解析Java AtomicInteger 原子类型

深入解析Java AtomicInteger原子类型 在进行并发编程的时候我们需要确保程序在被多个线程并发访问时可以得到正确的结果,也就是实现线程安全.线程安全的定义如下: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个类就是线程安全的. 举个线程不安全的例子.假如我们想实现一个功能来统计网页访问量,你可能想到用count++ 来统计访问量,但是这个自增操作不是线程安全的.coun

c++11 原子类型与原子操作

1.原子类型和原子操作(1)类型(2)操作(3)详述● 原子类型只能从其模板参数类型中进行构造,标准不允许原子类型进行拷贝构造.移动构造,以及使用operator=等● atomic_flag 是一个原子的布尔类型,无锁的,即线程对其访问不需要加锁:可支持test_and_set()是一种原子操作,用于在一个内存空间原子地写入新值并且返回旧值,如果对象被设置了,则返回true:clear()清除对象值,将变量值设为false:2.内存模型,顺序一致性和memory_order(1)类型(2)详述

零基础学python-4.5 标准类型分类

1.按存储分:原子类型和容器类型 原子类型:只能包含一个对象 容器类型:可以包含多个对象 分类 python类型 原子类型 数值和字符串 容器类型 列表.元组和字典 2.按是否可以变化分:可变和不可变 分类 python类型 不可变类型 数值.元组和字符串 可变类型 列表.字典 这里需要说明一下:为什么数值和字符串是不可变,我们通过下面一个例子说明: 通过上面两个图片我们可以看见,其实后面的值只不过是新建一个对象,重新赋值上去而已,所以说数值和字符串是不可变的 再来看看元组: 虽然里面的值变了,

聊聊高并发(二十)解析java.util.concurrent各个组件(二) 12个原子变量相关类

这篇说说java.util.concurrent.atomic包里的类,总共12个.网上有非常多文章解析这几个类.这里挑些重点说说. 这12个类能够分为三组: 1. 普通类型的原子变量 2. 数组类型的原子变量 3. 域更新器 普通类型的原子变量的6个, 1. 当中AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference分别相应boolean, int,  long, object完毕主要的原子操作 2. AtomicMarkableRe

OpenCv学习笔记(三)---OpenCv中基本数据类型--Point,Size,Rect,Scalar,Vec3b类类型的详细解释及其OpenCv中源代码的详细分析

/********************************************************************************************* 程序功能: OpenCv的基本数据结构源代码的解读,我们常用的OpenCv的基本数据结构有六种: 1--Point类 2--Size类 3--Rect类 4--Scalar类 5--Vec3b--向量模板类 6--Range类 编写环境: OpenCv2.4.8+VS2010 地点时间: 陕西师范大学 201

python标准类型分类

一. 存储模型 依据变量在内存中的组织分类. Python的类型, 就象绝大多数其它语言一样,能容纳一个或多个值.一个能保存单个字面对象的类型我们称它为原子或标量存储,那些可容纳多个对象的类型,我们称之为容器存储.(容器对象有时会在文档中被称为复合对象,不过这些对象并不仅仅指类型,还包括类似类实例这样的对象) 存储模型  分类                       Python 类型1. 标量/原子类型               数值(所有的数值类型),字符串(全部是文字)2. 容器类型

python的标准类型分类

数据属性 储存模型 更新模型 访问模型 数字 标量/原子类型 不可变类型 直接存取 字符串 标量/原子类型 不可变类型 顺序 列表 容器  可变类型 顺序  元组 容器 不可变类型 顺序 字典 容器 可变类型 映射 更新模型中的可不可改变,根据对象的ID.例: >>> a = 4;b = "a";c = [1,2,3];d = (1,2,3);e = {1,2,3}>>> id(a),id(b),id(c),id(d),id(e)(30303248L

XML文档类型定义---XML Schema结构

5.1 Schema概述 XML Schema是2001年5月正式发布的W3C的推荐标准,经过数年的大规模讨论和开发如今终于尘埃落定,成为全球公认的XML环境下首选的数据建模工具. 使用DTD虽然带来较大的方便,但是,DTD存在一些缺陷:一是它用不同于XML的语言编写,需要不同的分析器技术.这增加了工具开发商的负担,降低了软件瘦身的可能性,此外开发人员需要多学一门语言及其语法.而XML Schema是按标准XML规则编写的,更容易掌握.二是DTD不支持名称空间.随着大部分的数据处理日益以XML为

Python标准类型的分类

Python有3种不同的模型可以帮助对基本类型进行分类,这些类型更好的理解类型之间的相互关系以及他们的工作原理. 1 存储模型    能保存单个字面对象的类型,称为原子或标量存储:    能保存多个对象的类型,称为容器. 存储类型 分类 Python类型 标量/原子类型 数值(所有的数值类型),字符串(全部都是文字) 容器类型 列表,元组,字典 2 更新模型   以对象创建成功后,它的值是否可以进行更新为依据进行的分类,分为可变类型和不可变类型. 更新模型 分类 Python类型 可变类型 列表