强顺序内存模型
CPU按照正确的指令顺序执行
弱顺序内存模型
CPU为了性能提升,采用流水线技术,进一步挖掘指令的并行性,一段连续指令使用了不同的寄存器和内存地址,因此一些处理器可能会讲指令执行的顺序打乱执行。这就是弱顺序的内存模型。这种可能会导致错误发生,比如:
int thread_1(){
int t = 1;
a = t;
b = 2;
}
int thread_2{
while(b != 2);
cout << a << endl;
}
可能会导致输出的a为0
解决方案
C++11之前,采用内存栅栏解决。C++11之后,可指定内存顺序:
memory_order_relaxed 不对执行顺序做任何保证
memory_order_consume 本线程所有后续有关本操作的必须在本操作完成后执行
memory_order_acquire 本线程所有后续的读操作必须在本条操作完成才能执行
memory_order_release 本线程所有之前的写操作完成后才执行本操作
memory_order_acq_rel 同时包含acquire和release
memory_order_seq_cst 全部顺序执行
因此我们可以通过下面代码来避免该情况的发生:
int thread_1(){
int t = 1
a.store(t,memory_order_relaxed);
b.store(2,memory_order_release);
}
int thread_2(){
while(b.load(memory_order_acquire) != 2);
cout << a.load(memory_order_relaxed);
}
如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢