Solución:
-pthread
le dice al compilador que se vincule en la biblioteca pthread y que configure la compilación para subprocesos.
Por ejemplo, a continuación se muestran las macros que se definen cuando el -pthread
La opción se usa en el paquete GCC instalado en mi máquina Ubuntu:
$ gcc -pthread -E -dM test.c > dm.pthread.txt
$ gcc -E -dM test.c > dm.nopthread.txt
$ diff dm.pthread.txt dm.nopthread.txt
152d151
< #define _REENTRANT 1
208d206
< #define __USE_REENTRANT 1
Utilizando el -lpthread
La opción solo hace que la biblioteca pthread esté vinculada; las macros predefinidas no se definen.
En pocas palabras: debes usar el -pthread
opción.
Nota la -pthread
La opción está documentada como una opción específica de la plataforma en los documentos de GCC, por lo que es posible que no siempre esté disponible. Sin embargo, está disponible en plataformas para las que los documentos de GCC no lo enumeran explícitamente (como i386 y x86-64); debe usarlo cuando esté disponible.
También tenga en cuenta que GCC ha utilizado otras opciones similares, como -pthreads
(listado como sinónimo de -pthread
en Solaris 2) y -mthread
(para compatibilidad con subprocesos específicos de MinGW en Windows i386 y x86-64). Tengo entendido que GCC está intentando pasar a utilizar -pthread
uniformemente avanzando.
-pthread
Agrega soporte para subprocesos múltiples con la biblioteca pthreads. Esta opción establece indicadores tanto para el preprocesador como para el enlazador (man gcc
).
tiempo
-lpthread
entre en existencia mientras se enlaza, no habrá influencia durante el preprocesamiento.
Hay una respuesta aceptada, pero, en mi opinión, no proporciona suficiente contexto y conocimiento. De ahí esta respuesta adicional.
-lpthread
es una solución para un problema que ya no existe (desde ~ 2005).
En los viejos tiempos, había implementaciones propietarias de la API de Pthreads que no eran compatibles con POSIX, como LinuxThreads. El estándar POSIX simplemente dice que si uno quiere un comportamiento compatible con POSIX, entonces debe vincularse con -lpthread
y la vinculación necesaria para vincular una implementación compatible con POSIX de la API de Pthreads, debería haber muchas implementaciones de la misma.
No hay múltiples implementaciones de la API de Pthreads en los sistemas operativos modernos. Y es por eso -lpthread
ya no sirve para nada.
Compiladores como gcc
y clang
(y, probablemente, todos los compiladores compatibles con Linux) exigir utilizando -pthread
opción de línea de comandos para compilar y vincular aplicaciones multiproceso compatibles con POSIX y eso es lo que se debe usar.
En tiempo de compilación, -pthread
La opción manifiesta que se solicita la API de Pthread (puede haber varias API de subprocesos, por ejemplo, Solaris Threads) y define macros específicas de la plataforma (_REENTRANT
en Linux _MT
en Solaris).
En el momento del enlace, -pthread
enlaces en las bibliotecas requeridas (si las hay) que implementan el comportamiento de la API de Pthreads compatible con POSIX.
Lo anterior deja claro por qué -lpthread
no es necesario ni suficiente.