Significado do sinalizador -pthread ao compilar

143

Em vários projetos C e C ++ multiencadeados, vi o -pthreadsinalizador aplicado tanto ao estágio de compilação quanto ao de vinculação, enquanto outros não o usam e passam -lpthreadpara o estágio de vinculação.

Existe algum perigo em não compilar e vincular à -pthreadbandeira - ou seja, o que -pthreadrealmente faz? Estou interessado principalmente em plataformas Linux.

leeeroy
fonte

Respostas:

107

Experimentar:

gcc -dumpspecs | grep pthread

e procure por qualquer coisa que comece com %{pthread:.

No meu computador, isso faz com que os arquivos sejam compilados -D_REENTRANTe vinculados -lpthread. Em outras plataformas, isso pode ser diferente. Use -pthreadpara maior portabilidade.

O uso _REENTRANT, no GNU libc, altera a maneira como alguns cabeçalhos da libc funcionam. Como um exemplo específico, errnochama uma função retornando um local local do encadeamento.

Chris Jester-Young
fonte
3
Pode não ser apenas errnoe pré-processamento em geral. Não tenho certeza da relevância do artigo hpl.hp.com/techreports/2004/HPL-2004-209.pdf na prática para otimizações de gcc, mas com certeza fiquei impressionado com a profundidade da revisão.
Pascal Cuoq
2
Não acho que o exemplo errado esteja correto. Mesmo sem um sinalizador -pthread ou _REENTRANT definido, meu errno.h (glibc 2.10.1) e gcc (4.4.1 em amd64) gera uma chamada dinâmica para manipulação de errno e não se vincula ao endereço do símbolo.
Andy Ross
1
@ Pascal: Obrigado pelo link. Ele está um pouco acima da minha cabeça no momento, mas parece que o ponto central é que o encadeamento não pode ser apenas "implementado", mas deve ser projetado como parte do modelo de memória. Eu concordo completamente com isso.
Chris Jester-Young
2
@ Andy - sua versão do gcc pode ser criada para fornecer -D_REENTRANTou -pthreadautomaticamente. Execute o seu build g++ -ve ele irá despejar muita saída sobre quais parâmetros o front-end do compilador está realmente passando para cc1pluse ld.
Tom
3
Ainda há uma pergunta não respondida aqui: Existe algum perigo de não compilar e vincular ao sinalizador -pthread - ou seja, o que realmente faz -pthread?
Natelho
40

De man gcc:

-pthread Adiciona suporte para multithreading com a biblioteca pthreads. Esta opção define sinalizadores para o pré-processador e o vinculador.

Dmitry
fonte