2012-04-07 10 views
8

Uso <thread> <atomic> <mutex> etc. en mi código, que incluye varios algoritmos sin bloqueos. Me estoy dirigiendo (eventualmente) a un entorno Linux. He estado desarrollando con la versión Beta de Visual Studio 2011, que si bien carecía de características horribles en otras características de C++ 11, parece ser la única herramienta que implementa las funciones simultáneas.Concurrent C++ 11 - ¿Qué cadenas de herramientas se pueden usar?

Ver C++ 11 de soporte aquí:

Ahora bien, si los otros simplemente carecen de una biblioteca que contiene las C++ 11 características concurrentes, puedo utilizar simplemente just::thread, sin embargo, tanto clang como gcc responden "no" al modelo de memoria C++ 11, que al menos parece ser compatible con C++ visuales. No estoy exactamente seguro de cuál sería el efecto de esto, probablemente optimizando el código aparentemente libre de efectos secundarios, entre otras cosas erróneas.

Si por el momento evito completamente las compilaciones optimizadas y solo compilo compilaciones de depuración sin optimizaciones habilitadas, ¿es razonable usar la cadena de herramientas Clang o GCC?

+4

Mi conjetura inmediata es que si usas 'just :: thread', funcionará bien. Utiliza las primitivas nativas (Posix o Win32) para aplicar cosas como ordenar, por lo que creo que un compilador tendría que estar bastante roto en general para que fallara. –

+1

Probablemente deberías incluir una etiqueta relacionada con subprocesos múltiples en tu lista, Anthony Williams aparece regularmente aquí, así que si tienes la suerte lo notará. Creo que creó 'just :: thread' para que sea multiplataforma, así que no esperaría ningún problema. –

Respuesta

1

He usado gcc-4.7 en 64 bit linux y windows con éxito. std::thread etc. funciona perfecto en Linux incluso con gcc-4.6.
En windows gcc-4.7 (mingw64) tiene algunos problemas menores, pérdidas de memoria con destructores de std::condition_variable AFAIR.

4

GCC 4.7 status

C++ modelo de memoria de trabajo está en curso y será terminado en la próxima versión GCC. GCC 4.7 ha sido lanzado, así que esto es lo que puede esperar de él.

  • Implementación atómica completa para instrucciones admitidas sin bloqueos. Todas las operaciones atómicas se han implementado con los nuevos __atomic builtins, y la mayoría de los objetivos reflejan el parámetro del modelo de memoria en el código que se genera. Las optimizaciones no moverán las operaciones de memoria compartida más allá de las operaciones atómicas, por lo que ocurre lo mismo relaciones.
  • Cuando las instrucciones de bloqueo no están disponibles (ya sea a través del soporte de hardware o sistema operativo), las operaciones atómicas se dejan como llamadas de función para ser resueltas por una biblioteca. Debido a limitaciones de tiempo y una API que no está finalizada, no se proporciona libatomic con GCC 4.7. Esto es que se determina fácilmente al encontrar símbolos externos insatisfechos comenzando con _ atomic *.
  • En caso de que un programa requiera asistencia de biblioteca, se puede compilar y enlazar una única implementación de ejemplo de archivo C con el programa cliente para resolver estas llamadas a funciones externas mediante una implementación bloqueada. Descargar muestra libatomic
  • Las plantillas C++ son totalmente compatibles con objetos de tamaño arbitrario, aunque el archivo libatomic.c mencionado anteriormente puede ser necesario para satisfacer algunas de las clases definidas por el usuario . Si una clase se asigna al mismo tamaño que un tipo integral sin bloqueo admitido, también se usarán rutinas sin bloqueo.
  • Bitfields no son compatibles con el modelo de memoria. Es decir que pueden introducir carreras de carga o almacenamiento de datos debido a los accesos de palabra completa al leer o escribir.
  • Las optimizaciones no se han auditado completamente para verificar el cumplimiento, aunque se han realizado algunos trabajos. Algunas optimizaciones pueden introducir nuevas razas de datos que no estaban presentes antes. El número de casos conocidos es pequeño, y las pruebas de cumplimiento no son triviales. Si alguien encuentra un caso en el que una optimización introduce una nueva raza de datos, abra un caso bugzilla para que pueda ser abordado.

Apoyo en LLVM parece ser más largo: http://llvm.org/releases/3.0/docs/Atomics.html

Es difícil saber en qué medida esto se utiliza realmente en sonido metálico sin embargo. Parece que <atomic> básicamente funciona para algunos tipos. Estoy obteniendo afirmaciones de compilador para otros tipos diciendo que el tipo atómico fue inesperado, lo que da un poco de confianza para los tipos con los que sí funciona.

+0

Esto parece prometedor. De hecho, me estoy inclinando hacia el clang porque parece producir mensajes de error más útiles, y esa es una sincronización de tiempo sustancial para mí con C++. Hay un QtCreator experimental que usa clang para implementar el modelo de código (finalización, resaltado, refactorizaciones, etc.) Voy a intentarlo, ya que realmente extraño mi visual studio + visual assist x en Linux. – Eloff

Cuestiones relacionadas