1、一定会按正常顺序执行的情况

1.对同一块内存进行访问,此时访问的顺序不会被编译器修改

2.新定义的变量的值依赖于之前定义的变量,此时两个变量定义的顺序不会被编译器修改2、其他情况计算机会进行乱序执行

单线程的情况下允许,但是多线程情况下就会产生问题

3、C++中的库中提供了六种内存模型

用于在多线程的情况下防止编译器的乱序执行

(1) memory_order_relaxed

最放松的

(2) memory_order_consume

当客户使用,搭配release使用,被release进行赋值的变量y,获取的时候如果写成consume,那么所有与y有关的变量的赋值一定会被按顺序进行

(3) memory_order_acquire

用于获取资源

(4) memory_order_release

一般用于生产者,当给一个变量y进行赋值的时候,只有自己将这个变量释放了,别人才可以去读,

读的时候如果

使用acquire来读,编译器会保证在y之前被赋值的变量的赋值都在y之前被执行,相当于设置了内存屏障

(5) memory_order_acq_rel (acquire/release)

(6) memory_order_seq_cst (squentially consistent)

好处:不需要编译器设置内存屏障,morden c++开始就会有底层汇编的能力