Pregunta

En una aplicación C ++ Linux, ¿cuál es la forma más sencilla de obtener la funcionalidad que el Funciones entrelazadas en Win32 proporcionar? Específicamente, ¿una forma liviana de incrementar atómicamente o agregar enteros de 32 o 64 bits?

¿Fue útil?

Solución 7

Tras una revisión adicional, esto parece prometedor. Yay desbordamiento de pila.

Otros consejos

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

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

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

Las operaciones

RWM (lectura-modificación-escritura) y las que no se ejecutan en un solo paso necesitan el soporte de hardware 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 acceso a memoria atómica, por lo tanto, no se requiere libray externo. Aquí puede leer información sobre la API .

Estrictamente hablando, Linux no puede ofrecer atómicos "interbloqueados" funciona como las de Win32, simplemente porque estas funciones requieren soporte de hardware, y Linux se ejecuta en algunas plataformas que no ofrecen ese soporte. Dicho esto, si puede limitarse a Intel x86 / x64, eche un vistazo a la implementación del recuento de referencias en la biblioteca de punteros compartidos de Boost.

Las funciones atomic del Apache Portable Runtime están realmente cerca a las funciones Win32 InterlockedXXX.

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

Debe usar una operación bloquear xadd .

Vea, por ejemplo, esto .

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top