问题标签 [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 投票
4 回答
1847 浏览

language-agnostic - 并发和内存模型

我正在观看Herb Sutter 关于 GPGPU 和新的 C++ AMP 库的视频他在谈论内存模型并提到弱内存模型,然后是强内存模型,我认为他指的是读/写顺序等,但我不确定。

谷歌发现了一些关于内存模型的有趣结果(主要是科学论文),但是有人可以解释什么是弱内存模型,什么是强内存模型以及它们与并发的关系吗?

0 投票
1 回答
3349 浏览

java - Java 内存模型和 C++11 内存模型有什么相似之处?

新的 C++ 标准引入了内存模型的概念。Stack Overflow 上已经有关于它的问题,它是什么意思,它如何改变我们用 C++ 编写代码的方式等等。

我有兴趣了解 C++ 内存模型与旧的、众所周知的 Java 内存模型 (1.5) 之间的关系。是一样的吗?是不是很相似?它们有什么显着差异吗?如果是这样,为什么?

Java 内存模型已经存在很长时间了,很多人都非常了解它,所以我想通过将它与 Java 模型进行比较来学习 C++ 内存模型可能会有所帮助,不仅对我有帮助。

0 投票
2 回答
471 浏览

java - 执行器任务的所有副作用在 invokeAll 之后是否可见?

如果我将一些任务提交给Executorusing invokeAll,我是否保证提交的线程会看到任务执行的所有副作用,即使我没有调用get()每个返回Future的 s?

从实际的角度来看,这似乎是一个有用的保证,但我在 javadoc 中看不到任何内容。

更准确地说,Callable提交给执行程序的主体中的所有操作是否都发生在调用返回之前invokeAll()

无用地调用get()每个未来是很烦人的,而实际上返回类型是Void并且没有抛出异常——所有的工作都是作为副作用发生的。

0 投票
1 回答
2097 浏览

multithreading - C++ 静态变量初始化和线程

我有以下使用线程和静态变量初始化的 C++11 代码。我的问题是:

C++ 语言对静态变量的单一初始化有什么保证或保证——下面的代码显示了正确的值,但是我似乎在新标准中找不到提到内存模型应该如何与线程交互的段落。变量何时成为线程本地的?

0 投票
3 回答
209 浏览

.net - .NET 内存模型,同一程序的多个实例同时运行

.NET CLR 如何处理同时运行的同一程序的多个实例?

我假设每个实例都是独立的并且占据它自己独特的内存空间并且一个实例不能影响另一个实例。

是否有一个很好的在线资源(简要!)解释了 CLR 如何处理这个问题及其影响?

0 投票
3 回答
1294 浏览

c# - 是否可以从另一个线程观察部分构造的对象?

我经常听说在 .NET 2.0 内存模型中,写入总是使用释放栅栏。这是真的?这是否意味着即使没有显式的内存屏障或锁,也不可能在与创建对象不同的线程上观察到部分构造的对象(仅考虑引用类型)?我显然排除了构造函数泄漏this引用的情况。

例如,假设我们有不可变的引用类型:

是否可以使用以下代码观察除“John 20”和“Jack 21”以外的任何输出,例如“null 20”或“Jack 0”?

这是否也意味着我可以使所有共享字段都具有深度不可变的引用类型volatile,并且(在大多数情况下)继续我的工作?

0 投票
3 回答
689 浏览

java - Java 内存模型:编译器重新排列代码行

众所周知,Java 语言允许编译器重新排列已编译代码的行,只要重新排序对代码语义没有影响。然而,编译器只需要关心从当前线程看到的语义。如果这种重新排序影响多线程情况下的语义,通常会导致并发问题(内存可见性)

我的问题:

  1. 允许编译器释放这个 freedm 可以实现什么?编译器真的有可能通过重新排列代码来生成更高效的代码吗?我还没有看到一个实际的案例。我有时觉得,如果有的话,它可能带来的并发风险远远超过了好处。

  2. 程序员有什么办法可以告诉编译器不要像这样重新排列行?我知道使用同步原语有效地处理重新排列的副作用,但我问是否有任何直接的方法(编译器选项)来关闭它?

0 投票
2 回答
926 浏览

java - 使字段“易失性”可以防止并发情况下的所有内存可见性问题吗?

在并发情况下创建类字段是否可以volatile防止所有内存可见性问题?是否有可能对于下面的类,获取Test对象引用的线程首先看到x0(的默认值int)然后看到 10?我认为这是可能的,当且仅当构造函数在没有完成(不正确的发布)的情况下Test放弃参考。this有人可以验证/纠正我吗?

第二个问题:如果是final int x=10;呢?

0 投票
5 回答
15330 浏览

c++ - c++,std::atomic,什么是 std::memory_order 以及如何使用它们?

谁能解释一下std::memory_order简单的英语是什么,以及如何使用它们std::atomic<>

我在这里找到了参考资料和几个例子,但根本不明白。 http://en.cppreference.com/w/cpp/atomic/memory_order

0 投票
4 回答
805 浏览

java - Java并发访问字段,不使用volatile的技巧

前言:我知道在大多数情况下,使用 volatile 字段不会产生任何可测量的性能损失,但这个问题更具理论性,并且针对具有极高准确性支持的设计。

我有一个字段,List<Something>它是在构造后填充的。为了节省一些性能,我想将列表转换为只读地图。在任何时候这样做都需要至少一个可变的 Map 字段,因此使所有线程的更改可见。

我正在考虑执行以下操作:

这可能会导致多个线程生成映射,即使它们以序列化方式进入 get 块。如果线程在地图的不同相同实例上工作,这将不是什么大问题。更让我担心的是:

是否有可能一个线程将新的临时映射分配给映射字段,然后第二个线程看到它map!=null并因此访问映射字段而不生成新的,但令我惊讶的是发现映射是空的,因为 put 操作哪里还没有推送到某个共享内存区域?

评论回复:

  • 线程仅在只读之后修改临时映射。
  • 由于一些特殊的 JAXB 设置,我必须将 List 转换为 Map,这使得从 Map 开始变得不可行。