2011-09-09 9 views
37

El nuevo estándar de C++ introduce la noción de un modelo de memoria. Ya había preguntas sobre SO al respecto, qué significa, cómo cambia la forma en que escribimos el código en C++ y demás.¿Cuáles son las similitudes entre el modelo de memoria Java y el modelo de memoria C++ 11?

Estoy interesado en saber cómo se relaciona el modelo de memoria C++ con el modelo de memoria Java más antiguo y conocido (1.5). ¿Es lo mismo? Es similar? ¿Tienen alguna diferencia significativa? Si es así, ¿por qué?

El modelo de memoria java ha existido desde hace mucho tiempo y mucha gente lo sabe bastante bien, así que supongo que podría ser útil, no solo para mí, aprender el modelo de memoria C++, comparándolo con el java .

+0

El modelo de memoria para C++ depende de un compilador, ¿no? De todos modos, debería ser el mismo para C++ 03 y C++ 11 –

+10

No, C++ 11 presenta un modelo de memoria independiente de plataforma para concurrencia. Este es un gran avance para la programación de subprocesos múltiples en C++. – ciamej

+12

¿Por qué esto no es constructivo? Creo que señalar similitudes y diferencias es algo muy objetivo. Las respuestas ciertamente incluirán hechos (C++ 11 no hace X mientras que Java lo hace), referencias (Vea la sección estándar de C++ 11 Y), o experiencia específica. –

Respuesta

21

El modelo de memoria de Java era una influencia importante en el modelo de memoria de C++ 11, y era donde llegamos los términos sucede antes y sincroniza con-de. Sin embargo, el modelo de memoria C++ 11 ofrece un control mucho más preciso sobre el ordenamiento de la memoria que el modelo de memoria de Java.

Java volatile variables son equivalentes a C++ 11 std::atomic<> las variables, si se utiliza std::memory_order_acquire ordenamiento de memoria para lecturas, std::memory_order_release pedido para escrituras y std::memory_order_acq_rel pedido para las operaciones de RMW.

No hay equivalente en Java a std::memory_order_relaxed, o std::memory_order_seq_cst.

+0

+1. Buena respuesta. Dado que ha escrito un libro sobre 'C++ Concurrency in Action', sería agradable (y me gustaría especialmente) si publica una respuesta aquí en este tema: [C++ 0x presenta un modelo de memoria estandarizada. Qué significa eso? ¿Y cómo va a afectar la programación C++?] (Http://stackoverflow.com/questions/6319146/c0x-introduces-a-standardized-memory-model-what-does-it-mean-and-how-is- it-go) – Nawaz

+2

Parece que java volátil es equivalente a C++ std :: memory_order_seq_cst. De hecho, en Java, el caso IRIW debe ser consistente con la secuencia. Ver [esto] (http://shipilev.net/blog/2014/jmm-pragmatics/), [this] (http://llvm.org/docs/Atomics.html) y [this] (http: // stackoverflow.com/questions/24492061/the-volatile-key-word-and-memory-consistency-errors). –

Cuestiones relacionadas