原因:查看Oboe源码,发现内部使用到std::atomic。故在此记录一下memory_order的理解
概况:通过不同的memory_order实现线程同步
介绍:线程间同步常规用法是通过互斥锁实现,但是在对性能要求实时性高的情况选,该方法不可取,故需要无锁编程,而无锁编程核心就是原子操作。针对C11提出的Atomic operations library(原子操作库)memory_order的原理是不可避免的。由于编译器优化和cpu指令优化,故会存在执行顺序和代码顺序不一致的情况,且多线程情况下,A线程能观测到c.d变量值更改的顺序不同于B线程给c.d变量赋值的顺序,且不同线程观测也会不同。举例如下:下面的这个伪代码就是为了说明线程B观察到的变量变化和线程A的赋值顺序是不同的。
int c,d,e;
thread A thread B 此时有可能存在线程B发现e=3,d=2,而c=0的情况。
{ {
c = 1;d=2;e=3; assert(e==3);assert(d==2);assert(c==1);
} }
故在此引入了内存顺序,保证线程B在操作该内存时完全知道了A线程的变量赋值。首先介绍一下内存序