- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的函数中,我有以下两行代码:
static volatile uint64_t static_index = 0;
const uint64_t index = __sync_fetch_and_add(&static_index, 1, __ATOMIC_RELAXED);
static_index
在线程之间共享,而
index
是每线程。
__ATOMIC_RELEASE
甚至
__ATOMIC_SEQ_CST
这里?
最佳答案
您的静态初始值设定项是一个编译时常量,因此您可以(至少在实践中)依靠已经持有 0
的静态存储空间。当您的流程开始时。
(具体来说,它将在此处的 BSS 中。非零常量意味着它位于 .data
部分。)
我很确定它对于非常量初始值设定项也是安全的。
对于具有非常量初始值设定项的函数作用域静态变量,进入函数的第一个线程运行初始值设定项。编译器通常使用保护变量。快速情况(已初始化)涉及对该保护变量的获取加载,以检查静态变量是否已被初始化。否则,原子 RMW 确保恰好有 1 个线程运行初始化程序,而其他线程则等待它。
但是撇开实现细节不谈:我没有仔细检查标准对静态变量的说明。但是在执行初始化的线程中,static volatile foo = x
在它上面的RMW之前清楚地排序,因此保证发生在之前。
在其他线程中,问题是它们是否可以通过静态初始化重新排序。我认为答案一定是否定的,否则你会在没有原子内置函数的情况下读取或写入数据竞争 UB。
在一个帖子内,您可以查看static foo = non_const;
确保 foo
被初始化。即使我们不是进行初始化的线程。memory_order_release
或 acquire
如果其他线程正在与我们竞争,那么作为确保在原子 RMW 之前完成静态初始化的方法是没有意义的。这控制了我们操作从其他线程的 POV 的可见性顺序。 我很确定语言规则只要求 RMW 发生在 static foo = bar
之后。由于序列排序,暗示(无论是进行初始化还是在必要时等待它)。 如果您考虑非原子情况,其他任何事情都没有任何意义。您不能让其他线程读取未初始化的变量。
(请注意,C 仅支持函数作用域静态变量的非常量初始值设定项。只有 C++ 支持全局变量。)
顺便说一句,几乎没有理由使用已弃用/遗留的 GNU C __sync
builtins :手册说:它们不应该用于应该使用 ‘__atomic’ builtins instead 的新代码。 .
__sync
的第三个参数内置函数不是内存顺序 ,它是 GCC 忽略的“受内存屏障保护的变量的可选列表”。它是 __atomic_fetch_add
,它采用内存顺序参数。
或者在大多数情况下更好,C11 <stdatomic.h>
为 _Atomic static uint64_t static_index = 0;
并用 https://en.cppreference.com/w/c/atomic/atomic_fetch_add 修改它
atomic_fetch_add_explicit(&static_index, 1, memory_order_relaxed);
(或者,如果您愿意,
idx = static_index++;
但默认为 seq_cst,因此对于非 x86 ISA 的编译效率会降低。)
volatile _Atomic
所以你可以放下
volatile
类型限定符。使用
volatile
手卷松弛原子是
generally not recommended现在 C11/C++11 可用,但如果你这样做了,那么简单的加载/存储访问
volatile
有点像 _Atomic 和 mo_relaxed。
关于c - 我应该在访问静态初始化变量时使用屏障吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59985569/
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
PowerShell Web Access 允许您通过 Web 浏览器运行 PowerShell cmdlet。它显示了一个基于 Web 的控制台窗口。 有没有办法运行 cmdlet 而无需在控制台窗
我尝试在无需用户登录的情况下访问 Sharepoint 文件。 我可以通过以下任一方式获取访问 token 方法一: var client = new RestClient("https://logi
我目前正在尝试通过 Chrome 扩展程序访问 Google 服务。我的理解是,对于 JS 应用程序,Google 首选的身份验证机制是 OAuth。我的应用目前已成功通过 OAuth 向服务进行身份
假设我有纯抽象类 IHandler 和派生自它的类: class IHandler { public: virtual int process_input(char input) = 0; };
我有一个带有 ThymeLeaf 和 Dojo 的 Spring 应用程序,这给我带来了问题。当我从我的 HTML 文件中引用 CSS 文件时,它们在 Firebug 中显示为中止。但是,当我通过在地
这个问题已经有答案了: JavaScript property access: dot notation vs. brackets? (17 个回答) 已关闭 6 年前。 为什么这不起作用? func
我想将所有流量重定向到 https,只有 robot.txt 应该可以通过 http 访问。 是否可以为 robot.txt 文件创建异常(exception)? 我的 .htaccess 文件: R
我遇到了 LinkedIn OAuth2: "Unable to verify access token" 中描述的相同问题;但是,那里描述的解决方案并不能解决我的问题。 我能够成功请求访问 toke
问题 我有一个暴露给 *:8080 的 Docker 服务容器. 我无法通过 localhost:8080 访问容器. Chrome /curl无限期挂断。 但是如果我使用任何其他本地IP,我就可以访
我正在使用 Google 的 Oauth 2.0 来获取用户的 access_token,但我不知道如何将它与 imaplib 一起使用来访问收件箱。 最佳答案 下面是带有 oauth 2.0 的 I
我正在做 docker 入门指南:https://docs.docker.com/get-started/part3/#recap-and-cheat-sheet-optional docker-co
我正在尝试使用静态 IP 在 AKS 上创建一个 Web 应用程序,自然找到了一个带有 Nginx ingress controller in Azure's documentation 的解决方案。
这是我在名为 foo.js 的文件中的代码。 console.log('module.exports:', module.exports) console.log('module.id:', modu
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用 MGTwitterEngine"将 twitter 集成到我的应用程序中。它在 iOS 4.2 上运行良好。当我尝试从任何 iOS 5 设备访问 twitter 时,我遇到了身份验证 to
我试图理解访问键。我读过https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-se
我正在使用以下 API 列出我的 Facebook 好友。 https://graph.facebook.com/me/friends?access_token= ??? 我想知道访问 token 过
401 Unauthorized - Show headers - { "error": { "errors": [ { "domain": "global", "reas
我已经将我的 django 应用程序部署到 heroku 并使用 Amazon s3 存储桶存储静态文件,我发现从 s3 存储桶到 heroku 获取数据没有问题。但是,当我测试查看内容存储位置时,除
我是一名优秀的程序员,十分优秀!