2009-07-26 10 views

Respuesta

5

Usted busca full memory barrier builtins atómicos de gcc.

Tenga en cuenta el detalle en la referencia que he dado aquí dice,

El [siguiente] órdenes internas se pretende que sean compatibles con los descritos en la Solicitud binario Intel Itanium Processor específico interfaz, sección 7.4 . Como tales, se apartan de la práctica normal de GCC de usar el prefijo "__builtin_" y además están sobrecargados de manera que funcionan en múltiples tipos.

+0

No estoy muy familiarizado con este tema. ¿Es esta una funcionalidad específica del procesador? (Dado que su ejemplo es un Itanium ...) –

+0

En general, los usuarios no deben aprovechar la funcionalidad específica de plataforma y compilador cuando existen mecanismos estándar multiplataforma para lograr el mismo efecto. Lo que realmente necesita EMG-2 es usar la biblioteca de subprocesos POSIX (pthreads). –

+0

@Michael, estoy completamente de acuerdo con su opinión. Esa es la razón para resaltar notas específicas de la plataforma. – nik

7

Posix defines a number of functions actuando como barreras de memoria. Las ubicaciones de memoria no deben ser accedidas concurrentemente; para evitar esto, use la sincronización, y esa sincronización también funcionará como una barrera.

+1

La sincronización no es necesaria cuando todo lo que se necesita es bloquear y esperar una cola de escritor/un lector. Las bibliotecas POSIX no proporcionan operaciones de defensa/defensa/defensa AFAIK. –

+2

No solicitó el funcionamiento sin bloqueo; usted pidió barreras de memoria en el espacio del usuario. POSIX los tiene; se llaman "pthread_mutex_lock", "pthread_mutex_unlock", etc. Puede que no te guste el modelo que está detrás de ellos, pero esa * es * una respuesta oficial a tu pregunta. –

2

Linux x64 significa que puede usar las instrucciones de la barrera de memoria Intel. código Es posible que envolverlos en macros similares a los de las cabeceras de Linux, si esas macros no son apropiados o accesibles a su código

+0

Creo que esta es la mejor opción en realidad. La falla principal es el mantenimiento requerido de compiladores distintos y procesadores pasados ​​/ futuros/que no son de Intel. –

+0

Entonces, ¿qué es lo que quieres? No te gusta la solución portátil, y no te gusta el procesador específico. –

0

Los include/arch/qatomic_*.h cabeceras de una distribución reciente Qt incluyen (LGPL) para una gran cantidad de arquitecturas y todo tipo de barreras de memoria (adquirir, liberar, ambas cosas).

2

El Qprof perfiles de biblioteca (nada que ver con Qt) también incluye en su código fuente una biblioteca de operaciones atómicas, incluidas barreras de memoria. Trabajan en muchos compiladores y arquitecturas. Lo estoy usando en un proyecto mío.

http://www.hpl.hp.com/research/linux/qprof/download.php4

4

Use libatomic_ops. http://www.hpl.hp.com/research/linux/atomic_ops/

No es específico del compilador, y es menos problemático que el material de GCC. No es una biblioteca de giganto que ofrece toneladas de funcionalidad que no te importan. Simplemente proporciona operaciones atómicas. Además, es portátil para diferentes arquitecturas de CPU.

Cuestiones relacionadas