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

1、原子类型和原子操作
(1)类型

(2)操作

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

(2)详述
● x86以及SPARC(TSO模式)都被看作是采用强顺序内存模型的平台;而Alpha、PowerPC、ArmV7等平台,则采用弱顺序内存模型
● 存在弱顺序的内存模型原因:可使得处理器进一步发掘指令中的并行性,使得指令执行的性能更高
● 默认情况下,原子类型的变量在线程中总是保持着顺序执行的特性。
● 原子存储操作store可使用relaxed seq_cst release;原子写操作load可使用relaxed seq_cst acquire consume;可读可写操作可使用所有
● 先于发生关系总是传递的
3、线程局部存储
(1)拥有线程生命周期及线程可见性的变量
(2)如POSIX标准中的错误码全局变量errno,在多线程中将遭遇问题;
(3)c++11中的解决方法是通过thread_local 修饰符声明变量即可:如int thread_local errCode;则errCode在线程开始时被初始化,而在线程结束时该值不在有效
4、快速退出
(1)teminate函数;没有被捕捉的异常就会导致其被调用,其默认是去调用abort函数。可通过set_terminate函数改变默认行为
(2)abort不会调用任何析构函数<terminate默认下也一样>,抛出信号:SIGABRT
(3)exit:属于正常退出范畴的程序终止,会正常调用自动变量的析构函数,且会调用atexit注册的函数,调用次序与其注册顺序相反
(4)在C++11中,引入quick_exit,该函数并不执行析构函数而只是使程序终止。与abort不同,abort是异常退出,quick_exit和exit同属于正常退出。也可使用at_quick_exit注册函数

原文地址:http://blog.51cto.com/yebaoshan/2108101

时间: 2024-08-29 11:38:57

c++11 原子类型与原子操作的相关文章

再探c++11 Thread库之原子操作

我在之前一篇博文<初探c++11 Thread库之使写多线程程序>中,着重介绍了<thread>头文件中的std::thread类以及其上的一些基本操作,至此我们动手写多线程程序已经基本没有问题了.但是,单线程的那些"坑"我们仍还不知道怎么去避免. 多线程存在的问题 多线程最主要的问题就是共享数据带来的问题.如果共享数据都是只读的,那么没问题,因为只读操作不会影响到数据,更不会涉及对数据的修改,所以所有线程都会获得同样的数据.但是,当一个或多个线程要修改共享数据

深入解析Java AtomicInteger 原子类型

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

C++11并发编程:原子操作atomic

一:概述 项目中经常用遇到多线程操作共享数据问题,常用的处理方式是对共享数据进行加锁,如果多线程操作共享变量也同样采用这种方式. 为什么要对共享变量加锁或使用原子操作?如两个线程操作同一变量过程中,一个线程执行过程中可能被内核临时挂起,这就是线程切换,当内核再次切换到该线程时,之前的数据可能已被修改,不能保证原子操作. C++11提供了个原子的类和方法atomic,保证了多线程对变量原子性操作,相比加锁机制mutex.locak(),mutex.unlocak(),性能有几倍的提升. 所需头文件

原子类型

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

2.原子--深入浅出java原子操作

从相对简单的Atomic入手(java.util.concurrent是基于Queue的并发包,而Queue,很多情况下使用到了Atomic操作,因此首先从这里开始).很多情况下我们只是需要一个简单的.高效的.线程安全的递增递减方案.注意,这里有三个条件:简单,意味着程序员尽可能少的操作底层或者实现起来要比较容易:高效意味着耗用资源要少,程序处理速度要快:线程安全也非常重要,这个在多线程下能保证数据的正确性.这三个条件看起来比较简单,但是实现起来却难以令人满意. 通常情况下,在Java里面,++

Postgres 9.11 网络地址类型函数和操作符

9.11. 网络地址类型函数和操作符 Table 9-31 显示了可以用于 cidr 和 inet 的操作符. 操作符 <<,<<= >>,和 >>= 用于计算子网包含:它们只考虑两个地址的网络部分,忽略任何主机部分, 然后判断其中一个网络部分是等于另外一个还是另外一个的子网. Table 9-31. cidr 和 inet 操作符 操作符 描述 例子 < 小于吗 inet '192.168.1.5' < inet '192.168.1.6' &

Java并发——原子变量和原子操作与阻塞算法

十五年前,多处理器系统是高度专用系统,要花费数十万美元(大多数具有两个到四个处理器).现在,多处理器系统很便宜,而且数量很多,几乎每个主要微处理器都内置了多处理支持,其中许多系统支持数十个或数百个处理器. 要使用多处理器系统的功能,通常需要使用多线程构造应用程序.但是正如任何编写并发应用程序的人可以告诉你的那样,要获得好的硬件利用率,只是简单地在多个线程中分割工作是不够的,还必须确保线程确实大部分时间都在工作,而不是在等待更多的工作,或等待锁定共享数据结构. 问题:线程之间的协调 如果线程之间 

Java并发——原子变量和原子操作

很多情况下我们只是需要一个简单的.高效的.线程安全的递增递减方案.注意,这里有三个条件:简单,意味着程序员尽可能少的操作底层或者实现起来要比较容易:高效意味着耗用资源要少,程序处理速度要快:线程安全也非常重要,这个在多线程下能保证数据的正确性.这三个条件看起来比较简单,但是实现起来却难以令人满意. 通常情况下,在Java里面,++i或者--i不是线程安全的,这里面有三个独立的操作:获得变量当前值,为该值+1/-1,然后写回新的值.在没有额外资源可以利用的情况下,只能使用加锁才能保证读-改-写这三

c++11 数值类型和字符串的相互转换

string和数值类型转换 c++11提供了to_string方法,可以方便的将各种数值类型转换为 字符串类型: std::string to_string(int value); std::string to_string(long int value); std::string to_string(long long int value); std::string to_string(unsigned int value); std::string to_string(unsigned lo