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ê?
Respostas:
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.
fonte
g++-mingw-w64-x86-64
fornece dois arquivosx86_64-w64-mingw32-g++-win32
ex86_64-w64-mingw32-g++-posix
, ex86_64-w64-mingw32-g++
é alias para um deles; vejaupdate-alternatives --display x86_64-w64-mingw32-g++
.--threads=win32
. Então, enquanto os bits em falta não são implementadas no GCC, você deve configurar GCC com--threads=win32
.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 :
fonte
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.
fonte