descargar - ¿El estándar C++ 11 define formalmente las operaciones de adquisición, liberación y consumo?
c++14 (4)
Hay una definición resumida informal dada en una de las notas:
realizar una operación de liberación en
A
que los efectos secundarios previos en otras ubicaciones de la memoria se vuelvan visibles para otros subprocesos que luego realizan un consumo o una operación de adquisición enA
Además de eso, el comportamiento de las operaciones de adquisición y liberación se define completamente en 1.10, específicamente en cómo contribuyen a las relaciones de suceso y antes . Cualquier definición aparte del comportamiento es inútil.
En la norma C ++ 11, la sección 1.10 / 5 menciona, pero no define formalmente los términos acquire operation
, release operation
y consume operation
. Luego pasa a la Sección 29 a usar estos términos para describir las acciones de ciertos ordenamientos de memoria, operaciones atómicas y cercas de memoria. Por ejemplo, 29.3 / 1 en "Orden y consistencia" dice:
memory_order_release , memory_order_acq_rel y memory_order_seq_cst : una operación de almacenamiento realiza una operación de liberación [énfasis añadido] en la ubicación de la memoria afectada.
Este tipo de lenguaje se repite a lo largo de la sección 29, pero me molesta un poco que todos los significados para las enumeraciones de orden de memory_order
se basen en tipos de operación que a su vez no parecen estar formalizados por la norma, pero deben tener algún significado comúnmente aceptado para Que sean efectivos como definiciones.
Dicho de otra manera, si dijera "Una barra es un foo volteado", el significado concreto de bar y foo son ambiguos, ya que ninguno de los dos términos está definido formalmente. Sólo se definen sus naturalezas relativas.
¿El estándar de C ++ 11, o algún otro documento del comité de estándares de C ++ 11 define formalmente qué es exactamente una acquire operation
, una acquire operation
release operation
, etc., o son simplemente términos entendidos comúnmente? Si es lo último, ¿existe una buena referencia que se considere un estándar de la industria para el significado de estas operaciones? Lo pregunto específicamente porque los modelos de consistencia de la memoria del hardware no son creados iguales, y por lo tanto estoy pensando que debe haber alguna referencia comúnmente aceptada que permita a los implementadores de compiladores, etc. traducir correctamente la semántica de estas operaciones en comandos de ensamblaje nativos.
No veo ninguna definición formal de semántica de adquisición / lanzamiento después de un vistazo rápido a través del estándar, por lo que supongo que se supone que son términos entendidos comúnmente.
No pueden definir todo, después de todo.
No es una referencia definitiva, pero Raymond Chen ha escrito en su blog acerca de adquirir / liberar semánticas . Su publicación incluye un enlace a la definición de Microsoft de semántica de adquisición y lanzamiento , que también puede encontrar útil.
También creo que la semántica de adquisición / lanzamiento es bastante definitiva por sí misma; aunque son términos más específicos de hardware históricamente en lugar de términos de programación.
Pero creo que la sección 1.10 para 5 y 6 parecen coincidir con todas las definiciones de semánticas de adquisición / lanzamiento que he leído en otros estándares de idiomas, así como las definiciones de CPU.
Independientemente, uno de los puntos principales de C ++ 11 fue definir un modelo de memoria moderno para admitir código concurrente y de múltiples subprocesos. Me cuesta creer que no lo hayan hecho bien :)
en realidad, estas operaciones se definen en la sección 1.10 / 5-12.
par de release/acquire
corresponde al suceso antes de la relación; mientras release/consume
par a la relación ordenada por dependencia antes .