问题标签 [instruction-reordering]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如果 a 易失而 b 不是易失性,“b=3”可以在“a=2+b”之前重新排序吗?
因为 volatile 写入后的普通读写不禁止重排序,所以下面代码中的 b=3 可能会在 a=2+b 之前重排序吗?
c++ - memory_order_relaxed 是否尊重同一线程内的数据依赖关系?
鉴于:
假设只有一个线程写入,是否有可能f
返回一个值?对于非原子变量,这显然不是真的,但我不知道放松是否如此放松以至于它会忽略同一线程中的数据依赖关系?10
x
c++ - 在具有相同顺序的原子加载/存储之前使用 std::atomic_thread_fence 总是多余的吗?
鉴于:
可以去掉调用std::atomic_thread_fence
有什么影响吗?如果是这样,有一个简洁的例子吗?请记住,其他功能可能会存储/加载到b
和调用f
.
c - 如何保证C中指令的顺序
我的多线程代码如下:
线程 A
线程 B
调用 bar_off 直到 bar_on 完成之前,执行 foo() 是不安全的。
我可以重写我的代码如下:
int 易失性 foo_is_safe=0;
线程 A
线程 B
但我相信这不会起作用,因为编译器不需要保留设置 foo_is_safe 和调用 bar_* 函数之间的顺序。我什至不确定编译器不会简单地忽略将 foo_is_safe 设置为 0。
我对么?使我的代码安全的正确方法是什么,即强制 foo_is_safe 在 bar_off() 之前和 bar_on() 之后设置?
c# - C# 编译器是否重新排序 File-IO 指令?
我有以下用于配置文件写回的 C# 算法:
它是这样工作的:
- 原来的 File.txt 被重命名为 File.backup。
- 新的 File.txt 被写入。
- File.backup 被删除。
这样,如果在写入操作期间发生断电,仍然存在完整的备份文件。备份文件只有在写操作完成后才会被删除。读取过程可以检查备份文件是否存在。如果是,则认为普通文件已损坏。
要使这种方法发挥作用,严格遵循 3 个步骤的顺序至关重要。
现在我的问题是:C# 编译器是否可以交换第 2 步和第 3 步?
这可能会带来轻微的性能优势,因为第 1 步和第 3 步包含在相同的 if 条件中,这可能会诱使编译器将它们放在一起。我怀疑编译器可能会这样做,因为第 2 步和第 3 步对完全不同的文件进行操作。对于一个不知道我异常聪明的写回过程语义的编译器,第 2 步和第 3 步可能看起来不相关。
cpu-architecture - 为什么存储必须等到它们被提交才能修改内存?
在计算机体系结构主题中乱序和动态调度的背景下,为什么存储指令必须等到它们被提交(退休)才能修改内存?
我找到了一篇文章(http://users.ece.cmu.edu/~schen1/18-741_final_report.pdf),其中提到了以下内容:
最初,存储一发出就完成,但它们的缓存访问是在完成时按顺序完成的。基线模拟器通过暂停它们的高速缓存访问直到指令被提交来确保存储按程序顺序执行。不幸的是,这也保证了存储在它们提交之前会保留它们的 LSQ 条目,这在它们完成之后很长时间。
我从上面的引用中得出的结论是,我们需要让存储尊重原始程序指令的顺序,并让它们在提交后对内存进行更改,这尊重原始程序的指令顺序。
在这种情况下,提交或退出指令意味着写入其目标寄存器,这发生在指令位于重新排序缓冲区中时。