tópicos mingw-w64: posix vs win32

127

Estou instalando o mingw-w64 no Windows e há duas opções: threads win32 e threads posix. Eu sei qual é a diferença entre threads do win32 e pthreads, mas não entendo qual é a diferença entre essas duas opções. Duvido que, se eu escolher os threads posix, isso me impedirá de chamar funções WinAPI como CreateThread.

Parece que esta opção especifica qual API de encadeamento será usada por algum programa ou biblioteca, mas por quê? Pelo GCC, libstdc ++ ou por outra coisa?

Eu encontrei o seguinte: Qual é a diferença entre thread_posixs e thread_win32 na porta gcc do windows?

Resumindo, para esta versão do mingw, a versão threads-posix usará a API posix e permitirá o uso de std :: thread, e o threads-win32 usará a API win32 e desabilitará a parte std :: thread do padrão.

Ok, se eu selecionar os threads do win32, o std :: thread ficará indisponível, mas os threads do win32 ainda serão usados. Mas usado por quê?

Simon
fonte
Usado por aplicativos criados usando este gcc.
devnull
@ devnull, isso não é determinado pela API que eu usarei? Se eu selecionar a versão pthreads do MinGW, o que me impedirá de usar o WinAPI para threads?
22413 Simon
gcc irá impedi-lo, ou melhor: tornar-se instável
jiggunjer

Respostas:

122

O GCC vem com uma biblioteca de tempo de execução do compilador (libgcc), usada para (entre outras coisas) fornecer uma abstração de SO de baixo nível para funcionalidade relacionada a multithreading nos idiomas suportados. O exemplo mais relevante é libstdc ++ 's C ++ 11 <thread>, <mutex>e <future>, que não têm uma implementação completa quando GCC é construído com o seu modelo de segmento Win32 interna. O MinGW-w64 fornece um winpthreads (uma implementação de pthreads na parte superior da API multithreading do Win32) na qual o GCC pode vincular para ativar todos os recursos sofisticados.

Devo enfatizar que esta opção não proíbe que você escreva qualquer código que desejar (não tem absolutamente nenhuma influência sobre qual API você pode chamar no seu código). Ele reflete apenas o que as bibliotecas de tempo de execução do GCC (libgcc / libstdc ++ / ...) usam para sua funcionalidade. A ressalva citada por @James não tem nada a ver com o modelo de encadeamento interno do GCC, mas com a implementação de CRT da Microsoft.

Para resumir:

  • posix: habilite os recursos de multithreading C ++ 11 / C11. Faz com que a libgcc dependa da libwinpthreads; assim, mesmo que você não chame diretamente a API pthreads, estará distribuindo a DLL do winpthreads. Não há nada de errado em distribuir mais uma DLL com seu aplicativo.
  • win32: Não há recursos multithreading em C ++ 11.

Também não influenciam nenhum código de usuário que chame APIs Win32 ou APIs pthreads. Você sempre pode usar os dois.

rubenvb
fonte
7
Você sempre pode vincular o tempo de execução do gcc e o winpthreads estaticamente, removendo a necessidade de inclusão de DLL.
Alexander Shishenko 26/10/2015
3
Demorei um pouco para encontrar a opção correspondente no Linux, por isso, caso ajude outra pessoa: O pacote g++-mingw-w64-x86-64fornece dois arquivos x86_64-w64-mingw32-g++-win32e x86_64-w64-mingw32-g++-posix, e x86_64-w64-mingw32-g++é alias para um deles; veja update-alternatives --display x86_64-w64-mingw32-g++.
stewbasic
Hmm, você diz "... que não possui uma implementação completa quando o GCC é criado com seu modelo de encadeamento Win32 interno .... O MinGW-w64 fornece um winpthreads (uma implementação de pthreads na parte superior da API multithreading do Win32) que o GCC pode depois vincule para ativar todos os recursos sofisticados ". Portanto, se eu selecionar o modelo win32, o GCC ainda poderá ativar todos os recursos, porque utiliza winpthreads? Mas no marcador abaixo, você escreve "win32: sem recursos de multithreading em C ++ 11". Eu não entendo "O qual o GCC pode vincular ao ..." significa que, se eu não selecionar o win32, ele poderá selecionar ...?
Johannes Schaub - litb 29/04
@ JohannesSchaub-litb Bem, não. A mágica configury do GCC combina a seleção do modelo de encadeamento interno aos recursos ativados do libstdc ++, pois este foi construído sobre o invólucro "gthread" interno do GCC (que é apenas uma abstração fina de encadeamento do tipo posix. Faltam peças fundamentais para os recursos do C ++ 11 em que a camada quando você usa --threads=win32. Então, enquanto os bits em falta não são implementadas no GCC, você deve configurar GCC com --threads=win32.
rubenvb
Posso usar as bibliotecas pré-compiladas mingw do qt, que usam -win32, com outras bibliotecas que usam -posix, e usam as duas bibliotecas no mesmo programa?
Johannes Schaub - litb
16

Partes do tempo de execução do GCC (o tratamento de exceções, em particular) dependem do modelo de encadeamento que está sendo usado. Portanto, se você estiver usando a versão do tempo de execução que foi criada com os threads POSIX, mas decidir criar threads em seu próprio código com as APIs do Win32, é provável que tenha problemas em algum momento.

Mesmo se você estiver usando a versão de threading do Win32 do tempo de execução, provavelmente não deverá chamar as APIs do Win32 diretamente. Citando as perguntas frequentes do MinGW :

Como o MinGW usa a biblioteca de tempo de execução padrão do Microsoft C que acompanha o Windows, você deve ter cuidado e usar a função correta para gerar um novo thread. Em particular, a CreateThreadfunção não configurará a pilha corretamente para a biblioteca de tempo de execução C. Você deve usar o _beginthreadexque é (quase) completamente compatível com CreateThread.

James Holderness
fonte
7
Nesse caso, e as bibliotecas de threading de terceiros, como boost ou Qt? Existe alguma maneira de usar essas bibliotecas com o mingw64 sem precisar descobrir a biblioteca de encadeamento subjacente? O que aconteceria se eu decidisse arbitrariamente usar o boost :: threads com a variante posix de mingw?
tantuni 6/01/14
1
@ user460153 algumas informações qt-project.org/wiki/…
Alex V.
10
Esta resposta está errada. O tempo de execução do GCC não tem absolutamente nenhuma influência nas APIs do Win32.
Rubenvb 22/05
Leia a entrada FAQ vinculada. Esta resposta está correta.
Daira Hopwood 22/07
13

Observe que agora é possível usar parte do C ++ 11 std :: thread no modo de encadeamento win32. Esses adaptadores somente de cabeçalho funcionaram imediatamente para mim: https://github.com/meganz/mingw-std-threads

A partir do histórico de revisões, parece que há alguma tentativa recente de fazer disso parte do tempo de execução do mingw64.

Tom 7
fonte