C++顺序内存模型

强顺序内存模型

​ 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);
}

转载请注明出处!!!

如果有写的不对或者不全面的地方 可通过主页的联系方式进行指正,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值