2009-05-30 11 views
11

Estoy implementando un mecanismo sin cerradura que utiliza instrucciones atómicas (dobles) de comparación e intercambio, p. cmpxchg16bOperaciones atómicas en C++ para estructuras sin cerradura

Actualmente estoy escribiendo esto en ensamblador y luego vinculándolo. Sin embargo, me preguntaba si había alguna manera de que el compilador hiciera esto automáticamente por mí. p.ej. rodear el bloque de código con 'atómicamente' y hacer que descubra cómo implementar el código como una instrucción atómica en la arquitectura del procesador subyacente (o generar un error en tiempo de compilación si el arco subyacente no lo admite)?

P.S. Yo sé que gcc tiene algunos muebles empotrados (al menos para CAS)

http://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Atomic-Builtins.html#Atomic-Builtins

Respuesta

11

Ya kindof respondió here.

El estándar C++ 0x proporcionará algunos atomic datatypes, principalmente tipos enteros y vacíos usando std :: atomic <> template. Ese artículo menciona Boehm's atomic_ops project que puede descargar y usar hoy.

Si no es así, ¿no puede implementar su ensamblador en línea en el compilador? Sé que MSVC tiene la palabra clave __asm para las rutinas de ensamblador en línea. Google dice yes, gcc can do it too.

+8

MSVC tiene operaciones interconectadas, y GCC tiene funciones de operaciones atómicas integradas, por lo que no es necesario realizar el ensamblador en línea. Al utilizar las envolturas del compilador, se mantendrá portátil en todas las plataformas compatibles con el compilador. – bdonlan

+0

MSVC tiene operaciones interbloqueadas solo para tipos de datos largos, OP desea duplicar. – gbjbaanb

+0

gcc no tiene opciones integradas para DWCAS. MSVC tiene un built-in para DWCAS. Ningún SO tiene DW (doble palabra, por ejemplo, dos longitudes de puntero, una al lado de la otra) para incrementos, decrementos, etc. - DW solo existe y solo existe (y solo ha existido alguna vez) para CAS. –

5

El futuro "C++ 0x" estándar para C++ apoyará operaciones atómicas & c - véase, por ejemplo http://www.open-std.org/JTC1/sc22/wg21/docs/papers/2007/n2427.html para una discusión razonablemente detallada. Hasta que se apruebe y se implemente ampliamente el próximo estándar, por supuesto, no hay forma de que dicha funcionalidad sea "portable" entre los compiladores; si está interesado en compiladores específicos más allá de gcc, quizás pueda abrir otra pregunta específicamente sobre ellos.

+0

No estoy seguro de si me falta algo, pero el artículo vinculado no parece ser relevante. – bugmenot77

+0

Tiene razón, pegó la URL incorrecta, ahora edita para corregir, ¡gracias! –

Cuestiones relacionadas