问题标签 [memory-model]

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.

0 投票
7 回答
9613 浏览

c++ - 并发的 C++03 内存模型是什么?

C++03中并发的内存模型是什么?

(而且,C++11 是否更改了内存模型以更好地支持并发?)

0 投票
5 回答
4523 浏览

c - Delphi 是否有任何等效于 C 的 volatile 变量?

在 C 和 C++ 中,变量可以标记为volatile,这意味着编译器不会优化它,因为它可能在声明对象之外被修改。Delphi编程中是否有等价物?如果不是关键字,也许可以解决?

我的想法是使用Absolute,但我不确定,这可能会带来其他副作用。

0 投票
4 回答
408 浏览

c++ - const_cast 是否会导致实际的代码发射?

const_cast是否只是告诉编译器“停止抱怨,将其视为非常量指针”的一种方式?是否存在将const_cast本身翻译成实际机器代码的情况?

0 投票
3 回答
2750 浏览

.net - .NET 上 x86/x64/ia64 内存模型之间的差异

我正在寻找有关 x86/x64/ia64 上 .NET CLR/JIT 使用的内存模型之间差异的参考。我知道 x86 和 ia64 之间存在一些差异(指令重新排序、指令删除等),但我还没有找到关于 x86 和 x64 之间差异的参考。

我有一个针对一些非常严格的延迟数字的应用程序,并且此时只能在 x86 上运行,并且可能在 x64 上运行(绝对不是在 ia64 上)。我想知道我是否可以依赖 x86 JIT 实现的一些工件并且在 x64 上仍然相对安全,或者我是否应该对更松散的 ia64 JIT 进行编程(这将需要更多字段是易变的,并且在几个地方)。

在此先感谢您的任何指点。

0 投票
6 回答
8117 浏览

c# - Interlocked.CompareExchange 是否使用内存屏障?

我正在阅读 Joe Duffy 的关于Volatile 读写和及时性的帖子,并且我试图了解有关帖子中最后一个代码示例的一些信息:

当执行第二个 CMPXCHG 操作时,它是否使用内存屏障来确保 m_state 的值确实是写入它的最新值?还是只使用已经存储在处理器缓存中的一些值?(假设m_state未声明为 volatile)。
如果我理解正确,如果 CMPXCHG 不使用内存屏障,那么整个锁获取过程将不公平,因为第一个获取锁的线程很可能是获取所有锁的线程以下锁。我是否理解正确,或者我在这里错过了什么?

编辑:主要问题实际上是在尝试读取 m_state 的值之前调用 CompareExchange 是否会导致内存障碍。因此,当他们再次尝试调用 CompareExchange 时,是否所有线程都可以看到分配 0。

0 投票
2 回答
160 浏览

java - 由于内存不连贯,线程可以观察对象中的垃圾值吗?

经过大量研究后,我相信我非常了解 JMM,当然知道当一个对象在两个线程之间共享时,您必须在同一个监视器上同步所有访问。我知道,如果多个活动线程同时访问一个对象,那么所有关于他们将观察到什么的赌注都没有了。

但是,如果一个对象是在使用它的其他线程启动之前确定性地并且实际构建的(或者甚至构建了该线程),JMM 是否保证后面线程看到的对象的内容与配置的相同较早的设置线程。

IOW,是否可以在线程中第一次引用对象并观察由于例如CPU缓存而不是对象的真实内容而导致的脏内存?或者 JMM 是否保证在第一次获得对任何给定对象的引用时,它引用的内存是一致的?

我问是因为我在许多地方使用了一种特定的模式,但我仍然不确定。通常我有一个对象,它以零碎的方式构造和配置,然后不可变地使用。因为它是零碎配置的,所以它的所有成员都不能是最终的(除非必须,否则我不想将这些全部更改为构建器模式)。

例如,创建一个 HTTP 连接处理程序,并添加插件对象来处理特定的 HTTP 请求。处理程序是使用 mutators 创建和配置的,然后安装到 TCP 连接处理器中,该处理器使用线程池来处理连接。由于连接处理程序是在连接处理器的线程池启动之前配置和安装的,并且一旦安装到连接处理器中就不会更改,因此我不在设置所有内容的线程和处理连接的线程之间使用显式同步。

在这种特定情况下,很可能线程配置也是启动线程池的同一个线程,并且由于线程池启动是同步的,所有用完它的线程也同步在同一个线程池对象上,所以这个可能会掩盖任何潜在问题(我的 API 并不要求起始线程与配置线程相同)。

0 投票
5 回答
526 浏览

c# - 内存屏障和大型结构?

假设我有一个由 100 个字节组成的结构。我对以下代码有什么保证?

内存模型是否保证放置内存屏障后 100 字节的复制将完成?还是内存屏障仅适用于处理器架构大小的类型?(32 位为 4 个字节,64 位为 8 个字节)。
这就是volatile关键字仅适用于原始类型的原因吗?(如果我将一个 8 字节的成员声明为 volatile,这意味着将使用互锁的 instrinct 来更改它的值?[因为在 32 位机器上不能保证大于 4 字节的类型的原子性])。

我希望我足够清楚.. :)
谢谢

0 投票
5 回答
563 浏览

c# - 使用内存屏障

在下面的代码示例中,是否需要FuncA中的内存屏障来确保读取最新的值?

编辑:如果没有,我如何确保 FuncA 将读取最新值?(我想确保最近的值实际上存储在处理器的缓存中)[不使用锁]

0 投票
4 回答
447 浏览

c# - 写入/读取何时影响主内存?

当我将值写入字段时,关于新值何时保存在主存储器中,我能得到什么保证?例如,我怎么知道处理器没有将新值保存在它的私有缓存中,而是更新了主内存?
另一个例子:

是否有可能在Write()完成执行后,其他一些线程执行Read()但实际上会将“0”视为当前值?(因为也许之前对 m_foo 的写入还没有刷新?)。
什么样的原语(除了锁)可用于确保写入被刷新?


编辑
在我使用的代码示例中,写入和读取放置在不同的方法中。Thread.MemoryBarrier 不只影响存在于同一范围内的指令重新排序吗?

另外,假设它们不会被 JIT 内联,我如何确保写入 m_foo 的值不会存储在寄存器中,而是存储到主存储器中?(或者当 m_foo 被读取时,它不会从 CPU 缓存中获取旧值)。

是否可以在不使用锁或“volatile”关键字的情况下实现这一目标?(另外,假设我没有使用原始类型,而是使用 WORD 大小的结构[因此无法应用 volatile]。)

0 投票
4 回答
647 浏览

c# - 内存栅栏如何影响数据的“新鲜度”?

我对以下代码示例有疑问(取自:http ://www.albahari.com/threading/part4.aspx#_NonBlockingSynch )

紧随其后的是以下解释:

“障碍 1 和 4 阻止此示例写入“0”。障碍 2 和 3 提供新鲜度保证:它们确保如果 B 在 A 之后运行,读取 _complete 将评估为真。”

我了解使用内存屏障如何影响指令重新排序,但是提到的“新鲜度保证”是什么?

在文章的后面,也用到了下面的例子:

这个例子后面跟着这个解释:

“这个程序永远不会终止,因为完整的变量缓存在 CPU 寄存器中。在 while 循环内插入对 Thread.MemoryBarrier 的调用(或锁定读取完成)可以修复错误。”

再说一遍......这里会发生什么?