2008-09-29 12 views
12

En una aplicación C++ Linux, ¿cuál es la forma más sencilla de obtener la funcionalidad que las funciones Interlocked en Win32 proporcionan? Específicamente, ¿una forma ligera de incrementar o agregar atómicamente números enteros de 32 o 64 bits?Equivalente entrelazado en Linux

Respuesta

-1

En una revisión posterior, this parece prometedor. Yay stack overflow.

+0

Por favor, no escriba solo el enlace de respuestas. La información clave debe estar en la respuesta. Complementariamente con un enlace por todos los medios. –

8

El código abierto de Intel ThreadBuildingBlocks tiene una plantilla, Atomic, que ofrece la misma funcionalidad que la clase Interlocked de .NET.

A diferencia de los integradores atómicos de gcc, es multiplataforma y no depende de un compilador en particular. Como señala correctamente Nemanja Trifunovic arriba, depende de la instrucción de CPU compare-and-swap proporcionada por los chips x86 e Itanium. Supongo que no esperaría nada más de una biblioteca Intel:)

6

Estrictamente hablando, Linux no puede ofrecer funciones atómicas "interconectadas" como las de Win32, simplemente porque estas funciones requieren soporte de hardware, y Linux se ejecuta en algunas plataformas que no ofrezcas ese apoyo. Una vez dicho esto, si puede limitarse a Intel x86/x64, eche un vistazo a la implementación del recuento de referencias en la biblioteca Boost de indicadores compartidos.

8

Solo unas pocas notas para aclarar el problema que no tiene nada que ver con Linux.

RWM (lectura-modificación-escritura) y las operaciones de las que no se ejecutan en un solo paso necesita el hardware de soporte para ejecutar atómicamente ; entre ellos incrementos y decrementos, fetch_and_add, etc.

Para algunas arquitecturas (incluyendo I386, AMD_64 e IA64) gcc tiene un soporte incorporado para el acceso a la memoria atómica, por lo tanto, no se necesita una biblioteca externa. Here puede leer información sobre la API.

3

Las funciones atomic de Apache Portable Runtime son realmente similares a las funciones de Win32 InterlockedXXX.

1

Puede insertar algún código de ensamblaje en su fuente, para usar instrucciones enclavadas x68 directamente.

Debería usar una operación de bloqueo xadd.

Ver por ejemplo this.

2

La biblioteca glib bastante común que se utiliza en programación GTK y QT, así como independiente, ofrece una variedad de operaciones atómicas. Consulte http://library.gnome.org/devel/glib/2.16/glib-Atomic-Operations.html para obtener una lista. Hay funciones de g_atomic para la mayoría de las operaciones que admite Interlocked en Win32, y en plataformas donde el hardware las admite directamente, están en línea como el código de ensamblaje necesario.

Cuestiones relacionadas