2009-01-31 14 views
13

State facendo principalmente Java e infarinatura di .NET per gli ultimi cinque anni e non ho scritto alcun C o C++ significativo durante quel periodo. Quindi sono stato lontano da quella scena per un po '.PThread è una buona scelta per il programma multi-thread C/C++ multi-threading?

Se oggi voglio scrivere un programma C o C++ che faccia parte del multi-threading e sia il codice sorgente portatile su Windows, Mac OS X e Linux/Unix, PThread è una buona scelta?

Il codice C o C++ non farà alcuna GUI, quindi non sarà necessario preoccuparsi di nulla.

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

ADDENDUM EDIT:

Am sporgendosi verso andare con spinta: filo - Voglio anche essere in grado di utilizzare C++ provare/eccezione cattura gestione troppo. E anche se il mio programma sarà piuttosto minimale e non in particolare OOPish, mi piace il incapsulare usando classe e spazio dei nomi - in contrapposizione alle funzioni non incorporate di C.

risposta

14

Bene, pthreads è il vecchio standard posix per la scrittura di programmi con thread. È la routine di threading di livello più basso, quindi è una buona scelta per il threading multipiattaforma.

Tuttavia, ci sono alternative:

  • boost::thread - uno stile STL threading biblioteca
  • di Intel Thread Building Blocks
  • OpenMP - entrambi questi sono un modo di livello superiore di applicazioni filettate scrittura senza bisogno per effettuare chiamate di threading.

Mentre questi ultimi sono tutti completamente supportati su tutte le piattaforme, (pthreads richiede un po 'di impostazioni del compilatore come il suo solo una parte del sottosistema POSIX di Windows, a meno che non si desidera utilizzare Pthreads-w32), allora forse questi ultimi sono una migliore scelta. boost :: i thread sono più come una libreria di threading, gli altri 2 sono metodi di alto livello per raggiungere il parallelismo senza bisogno di codificare i "thread", consentono di scrivere loop che vengono eseguiti simultaneamente automaticamente (soggetti a condizioni di buon senso)

Tuttavia, Boost :: thread non è una libreria compatibile con C.

modificare: le capacità multipiattaforma di cui sopra:

Intel TBB is cross-platform (di Windows *, Linux * e Mac OS * X), ​​supporta applicazioni a 32-bit e 64-bit e funziona con i compilatori Intel, Microsoft e GNU .

OpenMP dipende dal compilatore che si desidera utilizzare, ma GCC e/o Intel compilers have supported OpenMP Windows, Linux e MacOS.

+0

"Poiché questi ultimi sono tutti completamente supportati su tutte le piattaforme" - Se da tutte le piattaforme intendi Windows e un paio di piattaforme * nix, questo è vero. A parte questo, non lo è. –

+0

vedi la mia modifica. L'OP non ha mai chiesto niente di diverso da quelle 3 piattaforme. – gbjbaanb

+0

Ho accettato questa risposta perché presentava la più ampia gamma di informazioni sui possibili modi di procedere. – RogerV

4

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

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 consiste probabilmente nel wrapping di un wrapper comune per entrambi i pthread e l'API di threading di Windows.

11

Se hai bisogno che il tuo codice sia veramente portatile, potrebbe essere meglio stare lontano dalle varie librerie che diffondono Internet. Ad un certo punto troverai una piattaforma che non supportano e quindi dovrai creare la tua filiale.

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

Suggerirei di creare una classe, ad es. CThread, che ha implementazioni .cpp separate per ogni piattaforma e una funzione execute() puramente virtuale che viene chiamata dopo che il thread è stato creato/eseguito.

Ciò consente di implementare il codice di creazione thread e di sospensione/spegnimento/priorità utilizzando l'API più appropriata per la piattaforma. Potrebbe anche essere necessaria un'intestazione (ad esempio ThreadTypes.h) che contenga definisce/typedefs per ogni piattaforma.

E.g.

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

Questo è il modo che ho scritto tutto il mio codice di threading multi-piattaforma per piattaforme come PC/PS2/PS3/360/Wii. E 'anche un buon modello da seguire per le cose come mutex e di semafori, che se si hanno le discussioni siete certi di avere bisogno di un certo punto :)

+0

Mi piace - downvotes anonimi di persone che probabilmente non hanno mai spedito un'app su più piattaforme! FTW! –

+0

Ehi Andrew, ho postato la domanda originale. Sono rimasto un po 'sorpreso nel vedere che anche i tuoi sono stati votati.Ho fatto rotolare sottili classi C++ su threading Win32 - Avrei solo bisogno di astrarlo anche su POSIX Pthreads e avrei finito. D'altra parte, c'è Pthreads-win32. Tutto il resto ha già un pthread. – RogerV

+0

+1: l'incapsulamento è * sempre * tuo amico. Potrebbe sembrare un lavoro extra, ma quel minimo extra di tempo finirà per salvarti il ​​culo. Soprattutto quando qualcuno rompe lo standard e ha dei valori di errore imprevisti da testare. –

0

mi scommettere su ZThread

semplice API, più facile da usare di pthreads e libero

+0

Qualche idea del motivo per cui ricevo tanti messaggi sulla mia console quando utilizzo la libreria Zthread? Ad esempio 'ThreadQueue created',' User thread created ', ecc. Sembra che questi siano messaggi DEBUG dalla libreria, come posso disattivarli? – lqr

Problemi correlati