2011-09-09 73 views
37

新的C++标准引入了内存模型的概念。关于它的问题已经有问题了,它是什么意思,它如何改变我们在C++中编写代码的方式等等。Java内存模型和C++ 11内存模型有什么相似之处?

我有兴趣了解C++内存模型如何与旧的,众所周知的Java内存模型(1.5)相关联。它是一样的吗?它是否相似?他们有什么重大的区别?如果是这样,为什么?

Java内存模型已经存在了很长时间,很多人都很熟悉它,所以我想这不仅对我来说可能对学习C++内存模型很有帮助,通过将它与Java相比较。

+0

C++的内存模型依赖于编译器,不是吗?无论如何,它应该是相同的c + + 03和c + + 11 –

+10

不,C++ 11引入了独立于平台的并发内存模型。这对于C++中的多线程编程来说是一个重大突破。 – ciamej

+12

为什么这不具有建设性?我认为指出相似和不同之处是非常客观的事情。答案肯定会涉及事实(C++ 11在Java中不会执行X),引用(参见C++ 11标准部分Y)或特定的专业知识。 –

回答

21

Java的内存模型是在C++ 11内存模型的重要影响,是我们拉条款之前发生同步,与的。然而,与Java内存模型相比,C++ 11内存模型对内存排序提供了更精细的控制。

的Java volatile变量相当于C++ 11个std::atomic<>变量,如果使用std::memory_order_acquire内存排序进行读取,std::memory_order_release订购用于写,并std::memory_order_acq_rel排序为RMW操作。

在Java中没有与std::memory_order_relaxedstd::memory_order_seq_cst等效的内容。

+0

+1。很好的答案。既然你已经写了一本关于'C++ Concurrency in Action'的书,如果你在这个主题中发布一个答案,那么它将会很好(我特别高兴):[C++ 0x引入了一个标准化的内存模型。这是什么意思?而究竟是怎样影响到C++编程?](http://stackoverflow.com/questions/6319146/c0x-introduces-a-standardized-memory-model-what-does-it-mean-and-how-is-它去) – Nawaz

+2

看来,Java易失性相当于C++ std :: memory_order_seq_cst。实际上,在java中,IRIW的情况必须是序列一致的。参见[此](http://shipilev.net/blog/2014/jmm-pragmatics/),[此](http://llvm.org/docs/Atomics.html)和[此](HTTP:// stackoverflow.com/questions/24492061/the-volatile-key-word-and-memory-consistency-errors)。 –