std::atomic 内存屏障可用于在线程之间传输非原子数据吗?

2024-01-29

以下代码是否符合标准? (或者可以使其合规而不进行x原子或volatile?)

这类似于之前的一个问题 https://stackoverflow.com/questions/19680757/in-c11-can-stdatomic-be-used-to-transmit-non-atomic-data-between-two-thread,但是我想引用 C++ 标准的相关部分。

我担心的是原子store() and load()没有为非原子变量提供足够的编译器屏障(x在下面的示例中)以获得正确的释放和获取语义。

我的目标是实现无锁原语,例如队列,它可以在线程之间传输指向常规 C++ 数据结构的指针。

#include <atomic>
#include <chrono>
#include <iostream>
#include <thread>

int x; // regular variable, could be a complex data structure

std::atomic<int> flag { 0 };

void writer_thread() {
    x = 42;
    // release value x to reader thread
    flag.store(1, std::memory_order_release);
}

bool poll() {
    return (flag.load(std::memory_order_acquire) == 1);
}

int main() {
    x = 0;

    std::thread t(writer_thread);

    // "reader thread" ...  
    // sleep-wait is just for the test.
    // production code calls poll() at specific points

    while (!poll())
      std::this_thread::sleep_for(std::chrono::milliseconds(50));

    std::cout << x << std::endl;

    t.join();
}

对于获取/释放,是的,这就足够了。相关引述(来自参考参数 http://en.cppreference.com/w/cpp/language/memory_model——在大多数情况下与标准一样好):

内存模型

当一个表达式的计算写入某个内存位置而另一个计算读取或修改同一内存位置时,这些表达式被称为冲突。具有两个相互冲突的评估的程序会发生数据竞争,除非其中之一

  • both conflicting evaluations are atomic operations (see std::atomic)
  • 相互矛盾的评价之一发生在之前另一个(参见std::memory_order)

std::内存顺序

发布-获取订单

如果线程 A 中的原子存储被标记memory_order_release并且线程 B 中来自同一变量的原子加载被标记memory_order_acquire,从线程 A 的角度来看,在原子存储之前发生的所有内存写入(非原子和宽松原子)在线程 B 中都成为可见的副作用,即一旦原子加载完成,线程 B 就能保证看到线程 A 写入内存的所有内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::atomic 内存屏障可用于在线程之间传输非原子数据吗? 的相关文章

随机推荐

  • 如何在 C++ 中检查系统是否处于活动状态?

    我正在编写仅当 PC 上没有人类活动时才需要运行的代码 例如当屏幕保护程序运行时 关于如何在 Windows 下用 C 执行此操作有什么建议吗 talnicolas 只是为了使用未使用的资源 有多少次人们让计算机打开但他们在另一个地方 您可
  • Flutter、Visual Studio 代码项目卡在分析中

    我有一个 flutter 项目 可以使用 git 终端和 flutter 命令毫无问题地运行 flutter run但最近当我尝试使用 Visual Studio Code 打开同一个项目时 我一直面临这个问题 一旦 VS Code 启动
  • ggplot2:用图例制作多条线+带

    我想在 ggplot2 中绘制一个图 多行 每个都有一条环绕的丝带 具有用户指定的颜色 并带有显示线条颜色和色带颜色的图例 向下滚动查看一个绘图示例almost达到我所追求的目标 我见过相关的问题 但没有一个能够一起解决所有这些问题 并且我
  • 将空参数传递给 SignalR 客户端代理时“值不能为空”

    使用 SignalR v2 0 2 我收到此异常 Value cannot be null Parameter name o at Newtonsoft Json Utilities ValidationUtils ArgumentNotN
  • 如何开始编写 iPad 应用程序?

    我从桌面 Apple 编程中了解到 Objective C 但我想跟上 iPad 的潮流 开始开发一些小型的寓教于乐的小程序 iPad API 是否与 iPhone 相同 只是功能更强大 我需要加入 iPhone 开发者计划吗 起价仍然是
  • 窗口形式的一个窗口的 C# 多个 GUI [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我和我的朋友正在尝试使用 Visual Studios Community 开发一款文本游戏 到目前为止 我们已经以 Windows
  • 在ggplot2中,如何选择图例中出现哪个几何图形?

    一些几何图形掩盖了图例中其他几何图形的关键 特别是箱线图 如何选择图例中出现的几何图形 Eg qplot data CO2 x Type y uptake colour Plant shape Treatment geom boxplot
  • microsoft Visual Studio遇到这种情况需要关闭如何解决

    大家好 我遇到了这个问题microsoft visual studio has encountered a problem and needs to close特别是当我打开一个解决方案时 有多种解决方案 但当特别打开一个特定的解决方案时
  • 如何设置指令的动态控制器?

    空谈很便宜 先展示我的代码 HTML div div 指示 angular module attrDirective directive addIcons function compile return restrict A control
  • 如何替换字符串中的QRegExp?

    我有一根绳子 例如 QString myString Today is Tuesday 要求是 当用户输入一个字符串时 如果该字符串包含在myString 那么该部分在myString应该是粗体 并且不区分大小写 Qt CaseInsens
  • 如何在不使用 Transform.Rotate 的情况下在本地轴或世界轴上旋转带有第二个四元数的四元数?

    Transform Rotate https docs unity3d com ScriptReference Transform Rotate html有一个非常有用的界面 用于选择是否相对于世界轴或局部轴进行旋转 在幕后 它对变换进行一
  • 如何在 Magento 中获取可配置项的所有超级属性选项

    我的系统中有可配置的产品 包括颜色和尺寸 我编写了以下代码来获取数据 但它太慢了 在添加这段代码之前 页面加载时间低于 2 秒 添加后则跃升至 15 秒 当然有更快的方法来获取这些信息 我有 2 个超级属性 每个属性大约有 10 个选项 我
  • 我破坏了 npm 吗?

    大约一天前 我发布了一个 npm 模块 从那以后我已经多次更新了版本 一开始是 0 0 0 然后是 0 0 1 现在是 0 1 1 当我访问https www npmjs com package skipper minio https ww
  • 在 Windows 上使用 Makefile 进行编译

    我想在 Windows 环境中使用 MakeFile 编译我的代码 我已经在 Linux 中创建了 Makefile 但不知道如何在 Windows 中创建和运行 我已经安装了 MinGW 并编辑了环境变量路径 我尝试像在 Linux 环境
  • 第二次“显示”后引导工具提示消失

    我想根据一些用户输入生成手动工具提示 最简单的方法是隐藏所有工具提示 然后显示相关的工具提示 我已将代码减少到最基本的部分 并且我的工具提示在第二次 显示 后不断消失 我正在使用 bootstrap 3 3 4 和 jquery 2 1 3
  • 需要 zend 框架 URL 重写帮助

    我需要 zend 框架中 URL 重写的帮助 如果我打印以下 URL echo this gt url array controller gt guestbook action gt edit id gt entry gt id null
  • 使用 XJC 生成 Java 源代码时使用 JAXWS enableWrapperStyle

    我正在尝试从 XSD 生成 Java 源代码 并且必须使用 JAXWS 禁用包装器样式 我已经编写了自定义绑定 但 JAXWS 似乎不适用于 XJC 我使用的绑定非常简单
  • 动态间接 Bash 数组

    我有这种格式的日志 log1 john time etc log2 peter time etc log3 jack time etc log4 peter time etc 我想为每个人创建一个以下格式的列表 name no lines
  • 在 MongoDB 中按 id 查找返回 null

    我对NodeJS and MongoDB 我正在尝试做一些非常基本的事情 但它似乎不起作用 我确信我在某个地方遗漏了一些东西 基本上 我试图根据 id 从数据库中查找用户 这是我的代码 function findUser id cb Mon
  • std::atomic 内存屏障可用于在线程之间传输非原子数据吗?

    以下代码是否符合标准 或者可以使其合规而不进行x原子或volatile 这类似于之前的一个问题 https stackoverflow com questions 19680757 in c11 can stdatomic be used