Domanda

Ho lavorato principalmente su Java e un'infarinatura di .NET negli ultimi cinque anni e durante quel periodo non ho scritto alcun C o C++ significativo.Quindi sono stato lontano da quella scena per un po'.

Se oggi voglio scrivere un programma C o C++ che esegua un po' di multi-threading e che il codice sorgente sia portabile su Windows, Mac OS X e Linux/Unix, PThread è una buona scelta?

Il codice C o C++ non eseguirà alcuna GUI, quindi non dovrai preoccuparti di nulla di ciò.

Per la piattaforma Windows, tuttavia, non voglio portare con me molti bagagli Unix, in termini di librerie runtime di emulazione Unix.Preferirei un'API PThread per Windows che sia un wrapper il più sottile possibile rispetto alle API di threading Windows esistenti.

MODIFICA DELL'APPENDICE:

Mi sto inclinando con Boost: Thread - Voglio anche essere in grado di utilizzare anche la gestione delle eccezioni di prova/cattura C ++.E anche se il mio programma sarà piuttosto minimo e non particolarmente oopish, mi piace incapsulare usando uno spazio di classe e nomi, al contrario di C funzioni disincarnate.

È stato utile?

Soluzione

Bene, pthreads è il vecchio standard posix per scrivere programmi threaded.Si tratta delle routine di threading di livello più basso, quindi è una buona scelta per il threading multipiattaforma.

Esistono però delle alternative:

Poiché questi ultimi sono tutti completamente supportati su tutte le piattaforme, (pthreads richiede alcune impostazioni del compilatore poiché è l'unica parte del sottosistema posix di Windows, a meno che tu non voglia utilizzare Pthread-w32), allora forse questi ultimi sono una scelta migliore.boost::threads è più simile a una libreria di threading, gli altri 2 sono modi di alto livello per ottenere il parallelismo senza la necessità di codificare i "thread", ti consentono di scrivere loop che vengono eseguiti contemporaneamente automaticamente (soggetto a condizioni di buon senso)

Boost::thread non è però una libreria compatibile con C.

modificare:capacità multipiattaforma di cui sopra:

Intel TBB è multipiattaforma (Windows*, Linux*e Mac OS*X), supporta applicazioni a 32 bit e 64 bit e funziona con compilatori Intel, Microsoft e GNU.

OpenMP dipende dal compilatore che desideri utilizzare, tranne GCC e/o Intel i compilatori hanno supportato OpenMP Windows, Linux e MacOS.

Altri suggerimenti

Se hai bisogno che il tuo codice sia veramente portatile, allora potrebbe essere meglio stare lontano dalle varie librerie che spargono Internet. Ad un certo punto troverai una piattaforma che non supportano e dovranno quindi creare il tuo ramo.

Anche questo non è un problema difficile da risolvere e può essere un buon esercizio per la creazione di codice multipiattaforma.

Ti suggerirei di creare una classe, ad es. CThread, che ha implementazioni separate .cpp per ogni piattaforma e una funzione execute () pure-virtual che viene chiamata dopo che il thread è stato costruito / eseguito.

Ciò consente di implementare tutto il codice di creazione del thread e di sospensione / arresto / priorità utilizzando l'API più appropriata per la piattaforma. Potresti anche aver bisogno di un'intestazione (ad esempio ThreadTypes.h) che contenga definite / typedefs per ciascuna piattaforma.

per es.

// ThreadTypes.h
#if defined(PLATFORM_WIN) || defined(PLATFORM_XBOX)
  typedef DWORD ThreadID
#elif defined(PLATFORM_PS3)
  // etc etc
#endif

Ecco come ho scritto tutto il mio codice di threading multipiattaforma per piattaforme come PC / PS2 / PS3 / 360 / Wii. È anche un buon modello da seguire per cose come i mutex e i semafori, che se hai dei thread ne avrai sicuramente bisogno :)

No, i pthreads non sono normalmente disponibili su Windows. (Ci sono alcuni tentativi per implementarlo, ma non è supportato direttamente dal sistema operativo, almeno.)

Se stai scrivendo C ++, Boost è, come al solito, la risposta. Boost.Thread ha una libreria di threading portatile (e più sicura).

In C, la soluzione più semplice è probabilmente quella di avvolgere scrivere un wrapper comune sia per pthreads che per l'API threading di Windows.

Scommetto su ZThread

API semplice, più facile da usare rispetto a PThreads e GRATUITO

Dai un'occhiata anche a: http://code.google.com/p/ting/

È multipiattaforma tra Windows e Linux. Nessun supporto per Mac OS ancora.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top