- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道为什么没有编译器准备将相同值的连续写入合并到单个原子变量,例如:
#include <atomic>
std::atomic<int> y(0);
void f() {
auto order = std::memory_order_relaxed;
y.store(1, order);
y.store(1, order);
y.store(1, order);
}
最佳答案
编写的 C++11/C++14 标准确实允许将三个存储折叠/合并为最终值的一个存储。即使在这样的情况下:
y.store(1, order);
y.store(2, order);
y.store(3, order); // inlining + constant-folding could produce this in real code
y
上旋转(带有原子负载或 CAS)将永远看到
y == 2
.依赖于此的程序将具有数据竞争错误,但只有普通错误类型的竞争,而不是 C++ 未定义行为类型的数据竞争。 (它只是带有非原子变量的 UB)。期望有时会看到它的程序甚至不一定有缺陷。 (见下文:进度条。)
y=1
之间没有发生来自其他线程的加载或存储。和
y=3
.
std::atomic
在你不想要的情况下阻止他们这样做,所以现在编译器只是选择从不将多个原子操作合并为一个。 (将它们全部合并为一个操作不会改变它们相对于彼此的顺序。)
y.store()
. (请参阅此问题的大多数其他答案,这些答案声称由于可能的读者等待看到中间值,因此要求存储单独发生。)即它违反了
principle of least surprise .
shared_ptr
循环中的 ref 计数 inc/dec。
num++; num--;
即使它不再触及
num
处的内存,它仍然必须完全阻止运行时和编译时重新排序。 .
std::atomic
API 使程序员能够控制此类优化,此时编译器将能够在有用时进行优化,即使在并非故意低效的精心编写的代码中也会发生这种情况。以下工作组讨论/提案链接中提到了一些有用的优化案例示例:
volatile atomic<int> y
将是确保不允许对其进行优化的存储的一种方法。 (因为
Herb Sutter points out in an SO answer 、
volatile
和
atomic
已经共享了一些要求,但它们是不同的)。另见
std::memory_order
's relationship with volatile
关于 cppreference。
volatile
不允许优化掉对象(例如,因为它们可能是内存映射的 IO 寄存器)。
volatile atomic<T>
主要修复了进度条问题,但如果/当 C++ 决定使用不同的语法来控制优化以便编译器可以在实践中开始这样做时,它有点丑陋并且可能在几年后看起来很愚蠢。
memory_order_release_coalesce
),在编译为 C++ 时不会改变现有代码 C++11/14 代码的行为。但它可能类似于 wg21/p0062 中的提议:使用
[[brittle_atomic]]
标记不优化案例.
volatile atomic
不能解决所有问题,并且不鼓励将其用于此目的 .它给出了这个例子:
if(x) {
foo();
y.store(0);
} else {
bar();
y.store(0); // release a lock before a long-running loop
for() {...} // loop contains no atomics or volatiles
}
// A compiler can merge the stores into a y.store(0) here.
volatile atomic<int> y
,允许编译器下沉
y.store()
出了
if/else
只做一次,因为它仍然在做 1 个具有相同值的商店。 (这将在 else 分支中的长循环之后)。特别是如果店铺只有
relaxed
或
release
而不是
seq_cst
.
volatile
确实停止了问题中讨论的合并,但这指出
atomic<>
上的其他优化对于实际性能也可能存在问题。
std::shared_ptr<T>
避免冗余原子操作并不总是那么容易,不过,因为没有它的非原子版本(尽管
one of the answers here 提供了一种简单的方法来为 gcc 定义
shared_ptr_unsynchronized<T>
)。
关于c++ - 为什么编译器不合并冗余的 std::atomic 写入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45960387/
我有一台计算机在一个非常严格的代理服务器后面,它只允许我上网和下载程序它不允许像 Atom 文本编辑器这样的程序下载它的包。 我的问题是如何仅使用基于浏览器的下载来安装它们? 最佳答案 这当然是可能的
我的 keymap.cson 文件中有这个: 'body': 'ctrl-alt-left': 'editor:select-to-first-character-of-line' 但是不行(没有
如何获取 Atom 中所有已安装和已激活插件的列表? 我可以用 apm list --installed --bare获取所有已安装的软件包,但我不想包含禁用的软件包。而且我有很多禁用的包。 最佳答案
我在 OSX 上,在 Atom 中打开了一个我没有命名的文件。我不得不重新启动计算机,当它再次出现时,我点击了错误的东西,它忘记了所有旧文件名,并且未命名的文件似乎消失得无影无踪。如果我使用 Time
当我搜索某个字符串(“在目录中搜索”)时,atom 允许做两件事:指定目录或文件扩展名(但它会在项目中的所有目录中搜索)。是否可以同时进行?例如。我想在 'src' 目录中进行递归搜索,但只使用 *.
我将 OSX 更新为 High Sierra,我的 Atom 停止从命令行工作。 $ atom . FSPathMakeRef(/Applications/Atom.app) failed with
下面屏幕截图中第 95 行和第 96 行之间的红色箭头在 GitHub 的 Atom 编辑器上意味着什么? 谢谢! 最佳答案 如果您当前打开的项目使用 Git 作为修订系统,装订线中的箭头表示您删除了
某些代码编辑器(例如 WebStorm)可以选择在编辑器失去焦点时自动保存。我在 Atom 编辑器中搜索了类似的选项,但尚未找到任何内容。 Atom 编辑器是否有一个设置,允许在失去焦点时自动保存已编
有没有办法(插件或其他东西)在 Atom 编辑器中使用分屏? 我查看了菜单,但找不到任何相关选项。 最佳答案 使用命令面板 使用 cmd + shift + p (OSX) 或 ctrl + 打开命令
我在 Atom 中安装了一个有缺陷的软件包,它导致编辑器反复崩溃。因此,我进入 Atom 设置将其删除,但出于好奇,我事先单击了“打开配置文件夹”按钮,这打开了一个空窗口和开发工具: Atom 随后崩
我已经使用atom.io有一段时间了并且非常喜欢它。我只缺少一件事。我以前使用过bracket和sublime,它们都有一个功能,你只需输入html就可以创建html文档的基本结构。 这只会设置 ht
我尝试在 Atom 编辑器中安装软件包,但总是失败,就像我无法连接到服务器一样。 例如,apm install split-diff 返回请求包信息失败:getaddrinfo ENOTFOUNDat
我使用的是 OSX El Capitan 和 Atom 1.2.4。而且我还安装了“tabs-to-spaces”包。 我正在尝试将编辑器设置为缩进并使制表符为 2 个空格。但我无法完成这项工作,这是
我使用的是 Atom 1.0.15。启动时,Atom 每次都会尝试打开 MTP 设备上的文件,这非常烦人。即使关闭引用 MTP 设备上的文件的选项卡后,Atom 也会尝试在下次启动时重新打开它。 修复
我在 Atom 中安装了一个有缺陷的软件包,它导致编辑器反复崩溃。因此,我进入 Atom 设置将其删除,但出于好奇,我事先单击了“打开配置文件夹”按钮,这打开了一个空窗口和开发工具: Atom 随后崩
我尝试在 Atom 编辑器中安装软件包,但总是失败,就像我无法连接到服务器一样。 例如,apm install split-diff 返回请求包信息失败:getaddrinfo ENOTFOUNDat
在 Atom 文本编辑器上,不同的文件树颜色代表什么。我的文件有 3 种不同的颜色:黑色、绿色和橙色。黑色文件无法正常运行,而绿色文件运行良好。如果有人知道颜色的具体含义,请告诉我。 最佳答案 颜色指
我正在尝试通过 Atom 进行完整搜索,寻找特定的文本。嗯,这听起来很简单,使用 Command + Shift + F ,但是,不会跟踪 node_modules ,并且不会扫描这些目录内的内容。我
以下是我在snippets.cson 文件中编写的两个片段: '.source.python': 'print statement': 'prefix': 'pr' 'body'
我试过在这里查看其他有类似问题的问题,但不幸的是我没能解决这个问题。 关于一些基本背景信息,我目前在实验室中使用 PC,并且实验室在机构的某个地方有 GPU 服务器。我正在尝试将 Atom 编辑器连接
我是一名优秀的程序员,十分优秀!