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
En una revisión posterior, this parece prometedor. Yay stack overflow.
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:)
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.
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.
Las funciones atomic de Apache Portable Runtime son realmente similares a las funciones de Win32 InterlockedXXX.
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.
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.
- 1. Equivalente a GetTickCount() en Linux
- 2. Dreamweaver equivalente para Linux
- 3. Dependency Walker equivalente para Linux?
- 4. equivalente de shell de Linux en IIS
- 5. #pragma comment (lib, "xxx.lib") equivalente en Linux?
- 6. Equivalente de InterlockedIncrement en Linux/gcc
- 7. Equivalente a SetThreadPriority en Linux (pthreads)
- 8. C Linux equivalente de Windows QueryPerformanceCounter
- 9. de Windows Bip() equivalente para Linux
- 10. Linux Mono Equivalente de .NET Windows Service
- 11. equivalente de Linux del comando DOS "inicio"?
- 12. ¿Cuál es el equivalente de _emit en Linux?
- 13. ¿Qué es equivalente a Linux mkdir -p en Windows?
- 14. Equivalente a la API de protección de datos en Linux
- 15. ¿Cuál es el equivalente de ldd de Linux en Windows?
- 16. equivalente para los contadores de rendimiento en Linux Win32
- 17. ¿Qué es equivalente a getch() y getche() en Linux?
- 18. ¿Cómo consigo un equivalente de/dev/Linux en una
- 19. ¿Cuál es el equivalente de C++ para AutoResetEvent en Linux?
- 20. ¿Hay un equivalente a MAX_PATH de WinAPI en Linux/Unix?
- 21. ¿Es este un diseño de sincronización entrelazado correcto?
- 22. impulso asio async_write: cómo no entrelazado llamadas async_write?
- 23. ¿Cuál es el equivalente de Linux a MAXDWORD?
- 24. ¿Hay un Vim equivalente al comando "fold" de Linux/Unix?
- 25. ¿Windows equivalente para "pantalla" de Linux u otra alternativa?
- 26. ¿Hay algún MSDN equivalente para Mac OS y Linux?
- 27. Linux equivalente al comando "abrir" de Mac OS X
- 28. Mac OS X equivalente al comando de Linux flock (1)
- 29. ¿Cuál es el equivalente de Linux de: MultiByteToWideChar & WideCharToMultiByte?
- 30. equivalente de Linux para el almacén de certificados de Windows
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. –