Qual é a diferença entre gcc -pthread
e gcc -lpthread
qual é usado durante a compilação de programas multithread?
Qual é a diferença entre gcc -pthread
e gcc -lpthread
qual é usado durante a compilação de programas multithread?
Respostas:
-pthread
diz ao compilador para se vincular à biblioteca pthread, bem como configurar a compilação para threads.
Por exemplo, o seguinte mostra as macros que são definidas quando a -pthread
opção é usada no pacote GCC instalado em minha 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
Usar a -lpthread
opção apenas faz com que a biblioteca pthread seja vinculada - as macros predefinidas não são definidas.
Resumindo: você deve usar a -pthread
opção.
Observação: a -pthread
opção está documentada como uma opção específica da plataforma nos documentos do GCC, portanto, pode nem sempre estar disponível. No entanto, ele está disponível em plataformas para as quais os documentos do GCC não o listam explicitamente (como i386 e x86-64) - você deve usá-lo quando disponível.
Observe também que outras opções semelhantes foram usadas pelo GCC, como -pthreads
(listado como sinônimo de -pthread
no Solaris 2) e -mthread
(para suporte a thread específico para MinGW no Windows i386 e x86-64). Meu entendimento é que o GCC está tentando passar a usar -pthread
uniformemente daqui para frente.
-lpthread
é suficiente para obter toda a biblioteca de threading POSIX.
-lpthread
faz obter toda a biblioteca de threading POSIX.
-lpthread
deve ser suficiente para obter suporte completo para pthreads. Nenhum outro sinalizador de compilação deve ser necessário.
-lpthread
mas não -pthread
é insuficiente para obter suporte para pthread, como já esclareci em meu comentário anterior.
-lpthread
. No entanto, a documentação do gcc sugere que isso pode ser insuficiente para obter suporte para pthreads, que é o ponto que mencionei nos comentários anteriores. Eu não me importo com o que acontece se você não fornecer -lpthread
algumas outras opções proprietárias aleatórias. Only -lpthread
é especificado por POSIX para garantir pthreads e isso não parece ser suficiente com gcc.
-pthread
Adiciona suporte para multithreading com a biblioteca pthreads. Esta opção define sinalizadores para o pré-processador e o vinculador ( man gcc
).
enquanto
-lpthread
vem a existir durante a ligação, não haverá influência durante o pré-processamento.
Existe uma resposta aceita, mas, IMO, ela não fornece contexto e visão suficientes. Daí esta resposta extra.
-lpthread
é uma solução para um problema que não existe mais (desde ~ 2005).
Antigamente, havia implementações proprietárias da API Pthreads que não eram compatíveis com POSIX, como LinuxThreads . O padrão POSIX meramente diz que se alguém deseja um comportamento compatível com POSIX, então deve-se vincular -lpthread
e vincular uma implementação compatível com POSIX da API Pthreads, caso haja muitas implementações dela .
Não há implementações múltiplas da API Pthreads em sistemas operacionais modernos. E é por isso que -lpthread
não serve mais a nenhum propósito.
Compiladores como gcc
e clang
(e, provavelmente, todos os compiladores compatíveis com Linux) requerem o uso da -pthread
opção de linha de comando tanto para compilar quanto para vincular aplicativos multiencadeados compatíveis com POSIX e é isso que se deve usar.
Em tempo de compilação, a -pthread
opção manifesta que a API Pthread é solicitada (pode haver várias APIs de threading, por exemplo, Solaris Threads) e define macros específicas da plataforma ( _REENTRANT
no Linux , _MT
no Solaris).
No momento do link, -pthread
links em bibliotecas necessárias (se houver) que implementam o comportamento da API Pthreads compatível com POSIX.
O que foi dito acima deixa claro porque -lpthread
não é necessário nem suficiente.