ARMv8内存系统学习笔记_第1页
ARMv8内存系统学习笔记_第2页
ARMv8内存系统学习笔记_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页ARMv8内存系统学习笔记

#include#include#include#includestd::atomicptr;intdata;voidproducer(){std::string*p=newstd::string("Hello");data=42;ptr.store(p,std::memory_order_release);}voidconsumer(){std::string*p2;while(!(p2=ptr.load(std::memory_order_consume)));assert(*p2=="Hello");//neverfires:*p2carriesdependencyfromptrassert(data==42);//mayormaynotfire:datadoesnotcarrydependencyfromptr}intmain(){std::threadt1(producer);std::threadt2(consumer);t1.join();t2.join();}上面代码中,由于assert(data==42)不依赖consumeload指令,因此有可能在load到非空指针之前执行,这时候不保证能看到releasestore,也就不保证能看到data=42。

Sequentially-consistent

Seq-cstordering和rel-acq保证相似的内存序,一个线程的seq-cstload如果看到了另一个线程的seq-cststore,则必可以看到store之前的指令,并且load之后的指令不会被store之前的指令看到,同时,seq-cst还保证每个线程看到的所有seq-cst指令有一个一致的totalorder。

典型的使用场景是多个producer多个consumer的情况,保证多个consumer能看到producer操作的一致totalorder。

#include#include#includestd::atomicx={false};std::atomicy={false};std::atomicz={0};voidwrite_x(){x.store(true,std::memory_order_seq_cst);}voidwrite_y(){y.store(true,std::memory_order_seq_cst);}voidread_x_then_y(){while(!x.load(std::memory_order_seq_cst));if(y.load(std::memory_order_seq_cst)){++z;}}voidread_y_then_x(){while(!y.load(std::memory_order_seq_cst));if(x.load(std::memory_order_seq_cst)){++z;}}intmain(){std::threada(write_x);std::threadb(write_y);std::threadc(read_x_then_y);std::threadd(read_y_then_x);a.join();b.join();c.join();d.join();assert(z.load()!=0);//willneverhappen}上面的代码中,read_x_then_y和read_y_then_x不可能看到相反的x和y的赋值顺序,所以必至少有一个执行到++z。

Seq-cst和其它ordering混用时可能出现不符合预期的结果,如下面例子中,对thread1来说,AsequencedbeforeB,但对别的线程来说,它们可能先看到B,很迟才看到A,于是C可能看到B,得到r1=1,D看到E,得到r2=3,F看不到A,得到r3=0。

//Thread1:x.store(1,std::memory_order_seq_cst);//Ay.store(1,std::memory_order_release);//B//Thread2:r1=y.fetch_add(1,std::memory_order_seq_cst);//Cr2=y.load(std::memory_order_relaxed);//D//Thread3:y.store(3,std

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论