2012-08-02 15 views
12

Estoy probando mis manos en las características g++ 4.6 y C++11. Cada vez que compilo un código de subprocesamiento simple usando el indicador -std=c++0x, o bien se bloquea con un error de segmentación o simplemente arroja alguna excepción extraña.En g ++ es el modelo de hilo C++ 11 utilizando pthreads en el fondo?

He leído algunas preguntas relacionadas con los hilos C++11 y me di cuenta de que, también necesito usar el indicador -pthread para compilar el código correctamente. Usar -pthread funcionó bien y pude ejecutar el código enhebrado.

Mi pregunta es si el modelo C++11 multi-threading utiliza Pthreads en el fondo? ¿O está escrito desde cero?

No sé si alguno de los miembros es gcc contribuyentes pero solo tengo curiosidad.

+0

@Kay Parece que la pregunta es sobre g ++ 4.6. – juanchopanza

+2

La "excepción extraña" probablemente sea 'std :: system_error', requerida por el estándar cuando no se pueden crear subprocesos (por ejemplo, porque no se ha vinculado a libpthread.so con' -pthread'). Estoy trabajando para mejorar el mensaje que da la excepción, ver http://gcc.gnu.org/PR52681 –

+1

@JonathanWakely .... Sí, esta es la excepción que estoy tratando en mi máquina Linux ... con AMD Turion X2 .... Aunque funcionó bien sin la bandera '-pthread' en mi compañero de habitación de la máquina Intel ... – Recker

Respuesta

21

Si ejecuta g++ -v, le dará un montón de información sobre cómo se configuró. Una de esas cosas será generalmente una línea similar a la

Thread model: posix 

lo que significa que se ha configurado para utilizar pthreads para su librería de hilos (std :: hilo en libstdC++), y que significa también hay que utilizar cualquier banderas que pueden ser necesarias para pthreads en su sistema (-pthread en Linux).

Esto no tiene nada específico que hacer con la norma, es sólo un detalle de la forma en que la norma es implementado por g ++

+4

NB una de esas cosas siempre será esa línea, si falta el soporte de hilo dirá "Modelo de subproceso: único" –

+0

Tenga en cuenta que el modelo de subproceso informado GCC también se refleja en otras partes de GCC, como libgcc, y el propio compilador. Se pueden construir muchas cosas además de la implementación de threads, no todas igualmente obvias. GCC es bastante "monolítico" en ese sentido ... – rubenvb

9

C++ no especifica cómo se implementan las discusiones. En la práctica, los subprocesos de C++ generalmente se implementan como envoltorios delgados sobre bibliotecas de subprocesos del sistema preexistentes (como pthreads o subprocesos de Windows). Incluso hay una disposición para acceder al objeto thread subyacente con std :: thread :: native_handle().

+2

G ++ no es un compilador de Unix, también funciona en Windows, donde se puede configurar para usar subprocesos pthread-win32 o nativos de Windows. Hasta ahora nadie ha hecho el trabajo para que GCC haga que su biblioteca de hilos C++ 11 funcione con los hilos de Windows. Publiqué algunas ideas en http://gcc.gnu.org/ml/libstdc++/2012-05/msg00020.html –

2

La razón por la que se bloquea es que si no se especifica -pthreads o -lpthreads, una serie de funciones de código auxiliar pthreads débilmente definidos a partir de libc están vinculados. Estas funciones de stub son suficientes para hacer que su programa se vincule sin errores. Sin embargo, crear un pthread requiere la biblioteca libpthread.a completa, y cuando el enlazador dinámico (dl) intenta resolver esas funciones faltantes, se obtiene una violación de segmentación.

Cuestiones relacionadas