Java内存模型和C++11内存模型有哪些相似之处?

48
新的C++标准引入了内存模型的概念。Stack Overflow上已经有人提出了相关问题,例如它是什么意思,它如何改变我们在C++中编写代码的方式等等。
我想了解C++内存模型与旧的广为人知的Java内存模型(1.5)之间的关系。它们是相同的吗?它们相似吗?它们有任何显著的差异吗?如果有,为什么?
Java内存模型存在已久,许多人都很熟悉它,因此我认为将其与C++内存模型进行比较可能会有所帮助,不仅对我而言如此。

11
不,C++11引入了一个适用于并发的跨平台内存模型。这是C++多线程编程的重大突破。 - ciamej
13
为什么这不被认为是建设性的?我认为指出相似性和差异性是非常客观的事情。答案肯定会涉及到事实(C++11 不支持 X,而 Java 支持),参考文献(参见 C++11 标准 Y 节),或者特定的专业知识。 - R. Martinho Fernandes
3
这些语言太不同了,无法用这种方式进行比较。可以从许多方面将C++内存模型与Java的相应模型进行比较,例如动态分配、并发等。选择其中一个方面进行讨论其影响,但是原问题过于模糊。投票关闭。 - Alexandre C.
4
“语言差异太大,无法用这种方式进行比较。” 这是胡说八道。 - curiousguy
2
以更简单的方式重申我的先前评论:这个问题被那些没有理解问题背景的人关闭了,正如他们上面的评论所证明的那样。 - Brent Bradburn
显示剩余6条评论
1个回答

25
Java内存模型对C++11内存模型有重要影响,我们从中提取了“先行发生”和“同步”的术语。但是,与Java内存模型相比,C++11内存模型在内存排序方面提供了更细粒度的控制。
Java中的volatile变量等效于C++11中的std::atomic<>变量,如果您对读取使用std::memory_order_acquire内存排序,对写入使用std::memory_order_release排序,并对RMW操作使用std::memory_order_acq_rel排序。
在Java中没有与std::memory_order_relaxed或std::memory_order_seq_cst对应的选项。

+1。很好的回答。既然你已经写了一本关于“C++ Concurrency in Action”的书,如果你在这个主题中发布一个答案,那将是很好的(我会特别高兴):[C++0x引入了一个标准化的内存模型。这意味着什么?它将如何影响C++编程?] (https://dev59.com/jm015IYBdhLWcg3w6QHA) - Nawaz
7
看起来 Java 中的 volatile 和 C++ 中的 std::memory_order_seq_cst 是等价的。实际上,在 Java 中,IRIW 情况必须是序列一致的。参见thisthisthis - Gabriele Mondada
Java的VarHandle提供了松散的加载和存储。有一个获取/释放和不透明(memory_order_relaxed)。主要问题是这些松散的访问模式在JMM中没有建模; 因此官方上它们是数据竞争。VarHandle还有各种围栏的官方支持。 - pveentjer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接