当前位置: 首页 > article >正文

c++ atmoic acquire/release

由于多核cpu缓存的存在,以及gcc编译优化,cpu指令层面的优化,导致程序的执行顺序可能跟你写的顺序不完全一致(reorder)。

但是在多线程编程中如何确保各个线程能正确的读取到各个变量呢(而不是cache中老旧的值)?

atomic acquire/release 这时就派上用场了,例如如下代码(ref preshing.com ):

如果 `Ready` 为 atomic 变量,那 Thread1 中的 write-release(flush cache) 操作和 Thread2 中的 read-acquire(reload cache) 操作可以形成一个内存同步。也就是编译器会在图中所示 atomic_thread_fence 出加上 memory barrier, 这样就确保了: 如果 Thread2 发现变量 `Read==1`,那么一定可以确保变量 r2==42

或者直接使用:

Thread1:                                                           Thread2:

    Ready.store(1, memory_order_release)           Ready.load(momory_order_acquire)


http://www.kler.cn/news/159894.html

相关文章:

  • Python实现FA萤火虫优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战
  • Python脚本模拟真实设备刷视频播放量、浏览量
  • buuctf 加固题 babypython WriteUp
  • PyTorch分布式overview
  • 如何把kubernetes pod中的文件拷贝到宿主机上或者把宿主机上文件拷贝到kubernetes pod中
  • python将时间戳转换为时间
  • 用js自定义一个(v-model)vModel双向绑定函数
  • C语言给定数字0-9各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意0不能做首位)
  • Spark_spark hints 详细介绍
  • HTTPS安全防窃听、防冒充、防篡改三大机制原理
  • vuepress-----2、初体验
  • 安全测试工具,自动发现网站所有URL!
  • Docker本地部署Firefox火狐浏览器并远程访问
  • mysql:免费的GUI客户端工具推荐并介绍常用的操作
  • vue 基础
  • C++ 中的运算符重载(二)
  • 【Web】NewStarCTF Week3 个人复现
  • centos7 yum安装jdk1.8
  • Go 模块系统最小版本选择法 MVS 详解
  • 编译器缓存
  • 多线程(初阶七:阻塞队列和生产者消费者模型)
  • SQL 错误 [1476] [22012]: ORA-01476: 除数为 0
  • 生殖感染对生育的影响有哪些?劲松中西医结合医院专家详细解读
  • js模块化的应用!!!(前无古人,后无来者)
  • Photoshop Elements 2023 v21.0(ps简化版)
  • ambari 开启hdfs回收站机制
  • SpringDataRedis 操作 Redis,并指定数据序列化器
  • git 克隆无权限-重新输入账号密码
  • 文献阅读:基于改进ConvNext的玉米叶片病害分类
  • 计算机网络之网络传输,三次握手和四次挥手