首页 > 其他分享 >__atomic_load_n

__atomic_load_n

时间:2023-10-14 11:56:15浏览次数:31  
标签:__ load abc ATOMIC 内存 atomic

可以使用gcc提供的内置函数__atomic_load_n()来原子地一次性读取多个变量的值。该函数使用了GCC内置的原子操作,可以保证在不被中断的情况下完成读取。

以下是一个示例代码,读取三个整数变量a、b和c的值:

 

#include <stdio.h>
#include <stdatomic.h>

int main(void) {
    int a = 1, b = 2, c = 3;
    int abc[3];
    __atomic_load_n(&a, &abc[0], __ATOMIC_SEQ_CST);
    __atomic_load_n(&b, &abc[1], __ATOMIC_SEQ_CST);
    __atomic_load_n(&c, &abc[2], __ATOMIC_SEQ_CST);

    printf("a = %d, b = %d, c = %d\n", abc[0], abc[1], abc[2]);
    return 0;
}

在上面的示例中,先定义一个整数数组abc,用来存放a、b和c的值。然后使用__atomic_load_n()函数,将a、b和c的值一次性读取到数组abc中。

__atomic_load_n()函数接受三个参数:第一个参数是要读取的变量的地址,第二个参数是指向存储读取结果的变量的指针,第三个参数是内存序(Memory Order),常用的内存序有三种:__ATOMIC_RELAXED、__ATOMIC_ACQUIRE和__ATOMIC_SEQ_CST。在这个例子中,使用的是最强的内存序__ATOMIC_SEQ_CST,可以保证最终结果的正确性。

 

内存模型

 

因为编译器的优化,实际代码执行顺序不一定是你写的顺序。

 

1. 比如对于a的修改,内存模型应该使用release。保证在这个操作之前的memory accesses不会重排到这个操作之后去,这样就不会向消费者提前释放可用信号。

__atomic_store_n(&a, true, __ATOMIC_RELEASE);

 

2 .对于a的读取,内存模型应该使用acquire。保证在这个操作之后的memory accesses不会重排到这个操作之前去,这样就不会提前读到生产者还未写完的数据。

__atomic_load_n(&a, __ATOMIC_ACQUIRE);

3 .对b的修改,调用atomic_compare_exchange_n函数,最后两个参数应该都是ATOMIC_RELAXED,即内存模式使用relaxed,即没有约束。因为b只是多个操作者之间用来做类似互斥的竞争

标签:__,load,abc,ATOMIC,内存,atomic
From: https://www.cnblogs.com/dream397/p/17763965.html

相关文章

  • 提交代码遇到not allowed to push code git info detecting host provider for 网址解
    查看git出错信息>gitpush-uoriginandroidinfo:detectinghostproviderfor'https://AA.com/'...warning:-----------------SECURITYWARNING----------------warning:|TLScertificateverificationhasbeendisabled!|warning:---------------......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(8) -- 使用Co
    在我们WPF应用端的时候,和WInform开发或者Vue前端开发一样,有时候也需要对内容进行转义处理,如把一些0,1数值转换为具体含义的文本信息,或者把一些布尔变量转换为是否等,都是常见的转换处理,本篇随笔介绍在WPF应用端对内容使用Converter类实现内容的转义处理的操作。1、使用Converter实......
  • Day2 前缀和 差分 双指针
    前缀和LuoguP2004领地选择二维前缀和板题,注意开longlong#include<iostream>#include<cstdio>#include<algorithm>usingnamespacestd;intn,m,c,x,y;longlongans,a[1005][1005],s[1005][1005];intmain(){ scanf("%d%d%d",&n......
  • python字符串的定义和表示
    在Python中,字符串是一种表示文本数据的数据类型。你可以使用单引号(')或双引号(")来定义字符串,如下所示:str1='HelloWorld!'str2="Pythonisawesome."Python中的字符串可以包含任何字符,包括字母、数字、标点符号和特殊字符。你还可以使用转义字符(\)来表示一些特殊字符,如换行符......
  • Android项目在 app 中通过 WebView 访问 url显示空白,使用浏览器可以打开,Android WebVi
    这是服务器证书校验WebView的安全问题服务器证书校验主要针对WebView的安全问题。在app中需要通过WebView访问url,因为服务器采用的自签名证书,而不是ca认证,使用WebView加载url的时候会显示为空白,出现无法加载网页的情况。使用ca认证的证书,在WebView则可以直接......
  • 学习英语的方法
    听力阅读想要突飞猛进,就是忘记中文,当你听,当你read的时候,只有英文,你的操作系统只有英文的帮助,否则翻译成中文再理解,CPU容易烧,永远学不好英语。世界上人们通过收藏东西来fullfillandenrichtheirlife,我就收藏英语单词吧。......
  • cdhit-common.h:39:17: fatal error: zlib.h: No such file or directory
     001、问题cd-hit编译报错如下:cdhit-common.h:39:17:fatalerror:zlib.h:Nosuchfileordirectory 002、解决方法yum-yinstallzlibzlib-devel 003、验证[[email protected]]#makeg++-fopenmp-DWITH_ZLIB-O2cdhit-common.c++-c......
  • 1.程序的基本概念
    1.3程序的调试编译时错误编译器只能翻译语法正确的程序,否则将导致编译失败,无法生成可执行文件。语法错误是最简单低级的错误,编译器错误提示较少,解决起来容易的多。运行时错误编译器检查不出这类错误,仍然可以生成可执行文件,但在运行时会出错导致程序崩溃。理应注意区分:编......
  • 多变量回归
    1.多元特征这种具有多个输入特征的线性回归模型被称为,多元线性回归2.向量化及Numpynumpy官方说明链接NumPy是一个库,它扩展了python的基本功能,增加了更丰富的数据集,包括更多数字类型、向量、矩阵和许多矩阵函数。NumPy和python可以无缝协作。Python算术运算符可用于......
  • HTML5 大文件断点续传完整思路整理
    用html5的新特性分割文件,为达到断点续传功能用spark.js获取文件md5以确保文件的唯一性流程概述: 复制代码(此功能前端共需调用3个接口,分别为简称作A/B/C)1,获取文件信息:使用HTML5的原生上传input,选择文件后,获取文件的所有信息(文件名、文件总字节数等)......