cpp 原子操作_C++ 新特性学习(八) — 原子操作和多线程库[多工内存模型]
这是我对C++新特性系统学习的最后一部分,之后就靠实践中再来看新标准的新特性啦。
在之前,我对这部分没太在意,直到看到了一篇文章 http://blog.csdn.net/pongba/article/details/1659952 才意识到,C++的多线程操作也是个麻烦的问题。
简而言之,C++编译器在进行编译优化的时候,认为当前是单进程的,并且遵循可观察行为(Observable Behavior)不变的原则。就是说在可观察行为不变的情况下,操作是可以被改变顺序的,而单进程可观察行为不变,不代表在多进程的情况下仍然不变。还是上大牛的例子:
例子一:
x = y = 0;
线程1
线程2
if(x == 1)
++y;
if(y == 1)
++x;
完全可以优化成
x = y = 0;
线程1
线程2
++y;
if(x != 1)
–y;
++x;
if(y != 1)
–x;
分别对于两个进程而言,可观察行为确实没有变化。而这种优化在某些时候确实会有比较明显的效果。但是很显然,语义变化了。在原来的结果里不可能发生 x和y都为0的情况,而优化过后,有可能出现。
再来个例子:
做何感想?所以说,现在的多线程库多少都是有缺陷的,要解决这一问题,只能从语言内存模型上动手脚了。
这里主要介绍两个库,原子操作和线程库
原子操作(Atomic)
头文件 #include
原子操作只支持C++类型
基本类型 std::atomic
扩展实现 std::atomic_char, std::atomic_int, std::atomic_uint 等是stl中的默认实现。
这个类型用于对数据进行原子操作,在操作的过程中可以指定内存规则。
主要的函数如下:
atomic_store
保存非原子数据到原子数据结构
atomic_load
读取原子结构中的数据
atomic_exchange
保存非原子数据到原子数据结构,返回原来保存的数据
atomic_fetch_add
对原子结构中的数据做加操作
atomic_fetch_sub
atomic_fetch_sub_explicit
对原子结构中的数据做减操作
atomic_fetch_and
对原子结构中的数据逻辑与
atomic_fetch_or
对原子结构中的数据逻辑或
atomic_fetch_xor
对原子结构中的数据逻辑异或
刚才提到了在原子操作时候的内存操作规则,内存操作规则主要是 std::memory_order,这是个枚举类型,里面包含着N多规则
值
定义规则
memory_order_relaxed
不保证顺序
memory_order_consume
类比生产者-消费者模型中的消费者读取动作(仅是读取,无计数器),保证该操作先于依赖于当前读取的数据(比如后面用到了这次读取的数据)不会被提前,但不保证其他读取操作的顺序。仅对大多编译环境的多线程程序的编译优化过程有影响。
memory_order_acquire
类比生产者-消费者模型中的消费者读取动作(仅是读取,无计数器),保证在这个操作之后的所有操作不会被提前,同样对大多编译环境的多线程程序的编译优化过程有影响。
memory_order_release
类比生产者-消费者模型中的生产者创建动作(仅操作一个数据),保证这之前的操作不会被延后。
memory_order_acq_rel
同时包含memory_order_acquire和memory_order_release标记
memory_order_seq_cst
全部存取都按顺序执行,在多核系统上容易成为性能瓶颈
在前面的原子操作的函数中,默认规则都是std::memory_order_seq_cst
此外,atomic还有一些标记类型和测试操作,比较类似操作系统里的原子操作
std::atomic_flag
标记类型
atomic_flag_test_and_set
尝试设置为占用(原子操作)
atomic_flag_clear
释放(原子操作)
多线程库
前面的代码里已经用到了一点多线程库的东西了
包含文件: #include
涉及的类是 std::thread
构造函数里有两种
一种是传入函数指针和参数(VC里参数最多四个)。线程立即执行
另一种是空构造。不会新增线程
另外需要注意的是std::thread的等于操作符是必须要通过move语义的,并且如果joinable的话会执行std::terminate()。
函数茫茫多,建议用的时候看文档去,我这里就不废话了,上面已经用到一点了(PS:配std::bind是相当的华丽哦)
文档如这行 http://en.cppreference.com/w/cpp/thread
以前写过一些测试代码,后来扔掉了。反正也很简单…
路漫漫其修远兮,吾将写代码而求索.
附上对C++11一些特性研究的总结:
分享到:
本文短链接:http://www.owent.net/DIPFO
cpp 原子操作_C++ 新特性学习(八) — 原子操作和多线程库[多工内存模型]相关推荐
- Java8新特性学习笔记
Java8新特性学习笔记 文章目录 Java8新特性学习笔记 一.接口和日期处理 1.接口增强 1.1.JDK8以前 VS JDK8 1)接口定义: 1.2.默认方法(default) 1)默认方法格 ...
- jdk7新特性学习笔记
jdk7新特性学习笔记 从网络down了视频看,记录下学过的东西. 1.二进制字面量 JDK7开始,可以用二进制来表示整数(byte,short,int和long),语法:在二进制数值前面加 0b或者 ...
- C++新特性探究(八):初始化列表(Initialization List)再探究
相关博文:C++新特性探究(七):初始化列表(Initialization List) 相关博文:C++新特性探究(八):初始化列表(Initialization List)再探究 相关博文:C++之 ...
- Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行 Stream的.max方 ...
- Java8新特性学习记录
前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.在Java Code Geeks上已经有很多介绍Java 8新特性的文章, 例如Playing with Java ...
- JDK8新特性-学习笔记
雀语笔记连接: https://www.yuque.com/g/u22538081/ghlpft/zcbyis/collaborator/join?token=pofOuJabmo9rgKvS# 邀请 ...
- C++11新特性学习
什么是C+11 C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology -- Programming langu ...
- 【转载保存】java8新特性学习
编者注:Java 8已经公布有一段时间了,种种迹象表明Java 8是一个有重大改变的发行版. 在Java Code Geeks上已经有大量的关于Java 8 的教程了,像玩转Java 8--lambd ...
- JDK 8 新特性- 学习中
目录 1. List Stream distinct() 去重 例子1 例子2 2 Streams filter() and collect() 3 Try后面跟括号 4 JDK8中有双冒号的用法 ...
最新文章
- golang 获取文件md5
- Python网络爬虫与信息提取(三)(正则表达式的基础语法)
- 阿里云服务器Svn-Server无法连接,阿里云服务器SVNServer配置
- linux中atoi函数的实现 值得借鉴,【转】atoi()函数的实现
- python可变序列_Python3基础(二)—— Python可变序列
- (转载)SQL基础-- 约束(CONSTRAINT)
- 斯坦福李飞飞教授:人口普查不用上门,谷歌街景加深度学习就搞定
- xp系统计算机怎么设置权限设置,xp系统共享权限如何设置|xp系统共享权限设置方法...
- python图片加透明通道并将背景设为透明
- wex5 java_WeX5简介
- IBM X3650服务器使用说明
- 打印六芒星_java
- GEF原理及实现系列(一、GEF概述)
- C++:实现量化Piecewise yield曲线测试实例
- 计算机水平考试 初级,计算机水平考试-初级程序员下午试题模拟38
- 化整为零 盛大在换轨
- Android Broadcast用法
- idea两个好用的插件-Code Reading Note与RestfulTool
- PVE 天龙八部TLBB服务端搭建(二)--服务端配置运行
- Java体系化学习路线图
热门文章
- 有符号数与无符号数间的转换
- 使用lambda去重、map排序、按任意时间间隔(小时、半小时、分钟)进行结果统计
- js中的date操作
- 将本地已经存在的代码跟github上新建的仓库建立关联,解决“fatal: 'origin' does not appear to be a git repository...”
- 程序员的进阶课-架构师之路(4)-栈
- github代码的提交与下载
- 比其他行业晚了十年的工业软件,转型的核心和动力是什么?
- 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集
- 20180321选择排序-简单选择排序
- 网络编程中的常见陷阱之 0x十六进制数(C++字面值常量)