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++开始就会有底层汇编的能力