c++ - ver - ¿Barreras de memoria en el espacio de usuario?(Linux, x86-64)
ver tamaño total de disco en linux (8)
Es fácil establecer barreras de memoria en el lado del kernel: las macros mb, wmb, rmb, etc. están siempre instaladas gracias a los encabezados del kernel de Linux.
¿Cómo lograr esto en el lado del usuario?
Está buscando la barrera de memoria completa incorporada en gcc.
Por favor, tenga en cuenta que el detalle en la referencia que di aquí dice:
Los [siguientes] elementos incorporados están diseñados para ser compatibles con los descritos en la Interfaz Binaria de la Aplicación Específica del Procesador Intel Itanium , sección 7.4. Como tales, se apartan de la práctica normal de GCC de usar el prefijo "__builtin_", y además se sobrecargan de tal manera que funcionan en múltiples tipos.
La biblioteca de perfiles Qprof (nada que ver con Qt) también incluye en su código fuente una biblioteca de operaciones atómicas, incluidas las barreras de memoria. Trabajan en muchos compiladores y arquitecturas. Lo estoy usando en un proyecto mío.
Linux x64 significa que puede utilizar las instrucciones de barrera de memoria de Intel. Puede envolverlos en macros similares a las de los encabezados de Linux, si esas macros no son apropiadas o no son accesibles para su código
Los encabezados include/arch/qatomic_*.h
de una distribución reciente de Qt incluyen el código (LGPL) para muchas arquitecturas y todo tipo de barreras de memoria (adquisición, versión, ambas).
Posix define una serie de funciones que actúan como barreras de memoria. Las ubicaciones de memoria no deben ser accedidas simultáneamente; para evitar esto, use la sincronización, y esa sincronización también funcionará como una barrera.
Simplemente tomando prestadas las barreras definidas para el kernel de Linux, simplemente agregue esas macros a su archivo de cabecera: http://lxr.linux.no/#linux+v3.6.5/arch/x86/include/asm/barrier.h#L21 . Y, por supuesto, otorgue crédito a los desarrolladores de Linux en su código fuente.
Utilice libatomic_ops. http://www.hpl.hp.com/research/linux/atomic_ops/
No es específico del compilador, y tiene menos errores que las cosas de GCC. No es una biblioteca de giganto que proporciona toneladas de funcionalidad que no te interesan. Solo proporciona operaciones atómicas. Además, es portátil para diferentes arquitecturas de CPU.
__sync_synchronize()
en GCC 4.4+
El Libro blanco sobre pedidos de memoria de Intel, una sección del volumen 3A del manual de Intel 64 y IA-32 http://developer.intel.com/Assets/PDF/manual/253668.pdf