Discussioni mingw-w64: posix vs win32


129

Sto installando mingw-w64 su Windows e ci sono due opzioni: thread win32 e thread posix. So qual è la differenza tra thread win32 e pthreads ma non capisco qual è la differenza tra queste due opzioni. Dubito che se sceglierò i thread posix mi impedirà di chiamare funzioni WinAPI come CreateThread.

Sembra che questa opzione specifichi quale API di threading verrà utilizzata da qualche programma o libreria, ma da cosa? Da GCC, libstdc ++ o da qualcos'altro?

Ho trovato questo: qual è la differenza tra thread_posixs e thread_win32 nel port gcc di Windows?

In breve, per questa versione di mingw, il rilascio di threads-posix utilizzerà l'API posix e consentirà l'uso di std :: thread, e thread-win32 utilizzerà l'API di win32 e disabiliterà la parte std :: thread del standard.

Ok, se seleziono i thread win32, std :: thread non sarà disponibile ma verranno comunque utilizzati i thread win32. Ma usato da cosa?


Utilizzato dalle applicazioni create utilizzando questo gcc.
devnull

@devnull, non è determinato dall'API che userò? Se seleziono la versione pthreads di MinGW, cosa mi impedirà di utilizzare WinAPI per i thread?
Simon

gcc ti impedirà, o meglio: diventa instabile
jiggunjer

Risposte:


124

GCC viene fornito con una libreria di runtime del compilatore (libgcc) che utilizza (tra le altre cose) per fornire un'astrazione del sistema operativo di basso livello per le funzionalità relative al multithreading nei linguaggi che supporta. L'esempio più rilevante è il C ++ 11 <thread>, <mutex>e <future>, di libstdc ++ , che non hanno un'implementazione completa quando GCC è compilato con il suo modello di threading Win32 interno. MinGW-w64 fornisce un winpthreads (un'implementazione di pthreads in cima all'API multithreading Win32) che GCC può quindi collegare per abilitare tutte le fantastiche funzionalità.

Devo sottolineare questa opzione non vieta di scrivere qualsiasi codice che si desidera (è assolutamente NO influenza su ciò che si può chiamare API nel codice). Riflette solo ciò che le librerie di runtime di GCC (libgcc / libstdc ++ / ...) usano per la loro funzionalità. L'avvertenza citata da @James non ha nulla a che fare con il modello di threading interno di GCC, ma piuttosto con l'implementazione CRT di Microsoft.

Riassumere:

  • posix: abilita le funzionalità di multithreading C ++ 11 / C11. Rende libgcc dipendente da libwinpthreads, così che anche se non chiami direttamente l'API pthreads, distribuirai la DLL winpthreads. Non c'è niente di sbagliato nel distribuire un'altra DLL con la tua applicazione.
  • win32: Nessuna funzionalità di multithreading C ++ 11.

Nessuno dei due ha influenza su alcun codice utente che chiama API Win32 o API pthreads. Puoi sempre usare entrambi.


7
È sempre possibile collegare staticamente il runtime di gcc e winpthreads, eliminando la necessità di includere la DLL.
Alexander Shishenko

3
Mi ci è voluto un po 'per trovare l'opzione corrispondente su Linux, quindi nel caso in cui aiuti qualcun altro: Il pacchetto g++-mingw-w64-x86-64fornisce due file x86_64-w64-mingw32-g++-win32e x86_64-w64-mingw32-g++-posix, ed x86_64-w64-mingw32-g++è alias di uno di essi; vedere update-alternatives --display x86_64-w64-mingw32-g++.
stewbasic

Hmm, tu dici "... che non hanno un'implementazione completa quando GCC è costruito con il suo modello di threading Win32 interno .... MinGW-w64 fornisce un winpthreads (un'implementazione pthreads in cima all'API multithreading Win32) che GCC può quindi collegalo per abilitare tutte le fantastiche funzionalità. " Quindi se seleziono il modello win32, GCC può comunque abilitare tutte le funzionalità, perché utilizza winpthreads? Ma nel punto in basso, scrivi "win32: nessuna funzionalità di multithreading C ++ 11". Non capisco. "Quale GCC può quindi collegarsi a ..." significa che se non seleziono win32, può selezionare ...?
Johannes Schaub - litb

@ JohannesSchaub-litb Beh, no. La magia di configurazione di GCC accoppia la selezione del modello di thread interno alle funzionalità abilitate di libstdc ++ poiché quest'ultima è stata costruita sopra il wrapper "gthread" interno di GCC (che è solo un'astrazione di thread simile a posix. Mancano pezzi fondamentali per le funzionalità di C ++ 11 in quel livello quando lo usi --threads=win32. Quindi, finché i bit mancanti non sono implementati in GCC, devi configurare GCC con --threads=win32.
rubenvb

Posso usare le librerie precompilate mingw di qt, che usano -win32, con altre librerie che usano -posix, e usare entrambe le librerie nello stesso programma?
Johannes Schaub - litb

16

Parti del runtime di GCC (la gestione delle eccezioni, in particolare) dipendono dal modello di threading utilizzato. Quindi, se stai usando la versione del runtime che è stata costruita con thread POSIX, ma decidi di creare thread nel tuo codice con le API Win32, è probabile che tu abbia problemi ad un certo punto.

Anche se stai usando la versione di threading Win32 del runtime, probabilmente non dovresti chiamare direttamente le API Win32. Citando dalle FAQ di MinGW :

Poiché MinGW utilizza la libreria di runtime Microsoft C standard fornita con Windows, dovresti fare attenzione e utilizzare la funzione corretta per generare un nuovo thread. In particolare, la CreateThreadfunzione non configurerà lo stack correttamente per la libreria di runtime C. Dovresti usare _beginthreadexinvece, che è (quasi) completamente compatibile con CreateThread.


7
In questo caso, che dire delle librerie di thread di terze parti come boost o Qt? Esiste un modo per utilizzare queste librerie con mingw64 senza dover capire la libreria di threading sottostante per queste? Cosa succederebbe se decidessi arbitrariamente di usare boost :: threads con la variante posix di mingw?
tantuni

1
@ user460153 alcune informazioni qt-project.org/wiki/…
Alex V.

10
Questa risposta è sbagliata. Il runtime di GCC non ha assolutamente alcuna influenza sulle API Win32.
rubenvb

Leggi la voce delle domande frequenti collegata. Questa risposta è corretta.
Daira Hopwood,

13

Si noti che ora è possibile utilizzare parte di C ++ 11 std :: thread nella modalità threading win32. Questi adattatori di sola intestazione hanno funzionato immediatamente per me: https://github.com/meganz/mingw-std-threads

Dalla cronologia delle revisioni sembra che ci sia un recente tentativo di renderlo parte del runtime di mingw64.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.