首页 > 编程语言 >C++并发之fence

C++并发之fence

时间:2023-04-23 21:26:12浏览次数:43  
标签:std r0 r1 fence 乱序执行 int C++ 并发

int x = 0;
int y = 0;

int r0, r1;

//cpu1
void f1() {
   x = 1;
    std::atomic_thread_fence(std::memory_order_acquire);     r0 = y;
}

//cpu2
void f2() {
    y = 1;
  std::atomic_thread_fence(std::memory_order_acquire);
    r1 = x;
}

 

fence的作用:防止这条 fence 指令上方的内存访问操作被移到下方,同时防止下方的内存访问操作移到上面,也就是防止了乱序。

 

在没有fence之前:如果CPU指令乱序执行,可能出现 r0 == 0 && r1 == 0 的情况的。不幸的是,由于 CPU 乱序执行的存在,这种情况是可能发生的。加了fence之后就不会出现这种情况了。

 

来源:https://zhuanlan.zhihu.com/p/413889872

标签:std,r0,r1,fence,乱序执行,int,C++,并发
From: https://www.cnblogs.com/woodx/p/17347773.html

相关文章

  • C++第四章课后习题4-8
    定义一个dog类,包含的age,weight等属性,以及对这些属性的操作方法,实现并测试这个类。1#include<iostream>2usingnamespacestd;3classDog{4private:5intage,weight;6public:7voidsetdog(inta,intb)8{9......
  • c++打卡十三天
    一、问题描述。 二、设计思路①、首先我们是用二分法解决这个问题。二分法是指在一个有序数组中,我们通过目标数与数组中间值的比较,对半缩小数组范围,比如一个升序数组中间值是4,当我们寻找一个比四小的数字时,只需要从首位和中间值中寻找,然后继续确定新的中间值,长此以往,就可以有......
  • 初学者代码训练Day6(c/c++)
    抓交通肇事犯要求一辆卡车违反交通规则,撞人后逃跑。现场有三人目击该事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。流程图代......
  • 【c&c++】vector 详解(C++)
    C++STL中的verctor好比是C语言中的数组,但是vector又具有数组没有的一些高级功能。与数组相比,vector就是一个可以不用再初始化就必须制定大小的边长数组,当然了,它还有许多高级功能。1.头文件#include<vector>2.初始化 如果vector的元素类型是int,默认初始化为0;如果vector元......
  • 【C++入门】类和对象(一) 详解(class、struct、类的定义、类的实例化、类的封装、对象
    1.面向过程和面向对象初步认识面向过程更加关注解决问题的过程和步骤。而面向对象关注的是对象,对一个事情拆分成不同的对象,靠对象之间的交互实现。例如:外卖系统面向过程:上架→点餐→派单→送餐注重过程步骤面向对象:(更加贴近现实之间的业务逻辑交互)骑手→商家←用户注重对象和对象......
  • C++数据结构(栈)
    栈是一种受限的线性表,将允许插入和删除的操作的一端称为栈顶,另一端称之为栈底,向栈中插入元素叫入栈,删除元素叫出栈。栈被称为是后进先出的线性表(LIFO)顺序栈顺序存储,即使用一段连续内存空间依次存储栈中数据。这里通过一维数组动态分配内存的方式保存数据定义代码如下:#defi......
  • 纯c++删除自身目录,和该目录下的所有内容______以及创建文件夹
    头文件.h#ifndefAUTODELETEADDFOLDER_H#defineAUTODELETEADDFOLDER_H#include<unistd.h>#include<stdlib.h>#include<errno.h>#include<dirent.h>#include<string.h>#include<iostream>#include<sys/stat.h>#inclu......
  • 并发编程(1)-线程与锁
    1.什么是线程?线程的状态与进程的状态非常相似,但线程是在进程内运行的轻量级实体。线程与进程的主要区别是线程共享相同的地址空间,而进程具有独立的地址空间。这意味着在进程中运行的每个线程都可以访问相同的变量和数据结构,而在不同进程中运行的线程则不能访问彼此的变量和数据......
  • 缓存穿透、并发和失效解决方案
    我们在用缓存的时候,不管是Redis或者Memcached,基本上会通用遇到以下三个问题:缓存穿透缓存并发缓存失效缓存穿透我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓......
  • 解决 Visual C++ 17.5 __cplusplus 始终为 199711L 的问题
    00.软件环境VisualStudio2022,VisualC++,Version17.5.401.问题描述在应用https://github.com/ToniLipponen/cpp-sqlite的过程中,发现源代码文件sqlite.hpp中,有一处宏,和本项目的C++LanguageStandard有关,如下图所示:将鼠标悬停在__cplusplus这个宏上,可以看到它......