2009-11-18 1 views
10

Come confrontare le librerie Boost Thread con le librerie java.util.concurrent?libreria java.util.concurrent vs. Boost Threads

Le prestazioni sono fondamentali e quindi preferirei stare con C++ (anche se Java è molto più veloce in questi giorni). Dato che devo scrivere codice in C++, quali librerie esistono per rendere il threading facile e meno soggetto a errori.

Ho sentito recentemente che dal JDK 1.5, il modello di memoria Java è stato modificato per risolvere alcuni problemi di concorrenza. Che ne dici di C++? L'ultima volta che ho fatto la programmazione multithread in C++ era 3-4 anni fa quando usavo i pthread. Anche se, non desidero più usarlo per un grande progetto. L'unica altra alternativa che conosco è Boost Threads. Tuttavia, non sono sicuro se sia buono. Ho sentito cose positive su java.util.concurrent, ma ancora niente sui thread Boost.

+7

Martin, penso che significa – zedoo

+7

Nella mia esperienza in qualsiasi momento qualcuno dice "Le prestazioni sono critiche" senza specifiche non è affatto così critico. Non scegliere C++ o Java per motivi di prestazioni, scegli C++ o Java perché hai più familiarità con esso o trovi più facile programmare in. –

risposta

10

I thread di boost sono molto più facili da utilizzare rispetto ai pthread e, a mio parere, leggermente più facili da usare rispetto ai thread Java. Quando viene creata un'istanza di un oggetto Boost, viene avviato un nuovo thread. L'utente fornisce una funzione o un oggetto funzione che verrà eseguito in quella nuova discussione.

E 'molto semplice come:

boost::thread* thr = new boost::thread(MyFunc()); 
thr->join(); 

Si può facilmente passare dati al filo memorizzando valori all'interno dell'oggetto funzione. E nell'ultima versione di boost, è possibile passare un numero variabile di argomenti al costruttore di thread stesso, che verrà quindi passato all'operatore () dell'oggetto della funzione.

È inoltre possibile utilizzare i blocchi stile RAII con boost::mutex per la sincronizzazione.

Si noti che C++ 0x utilizzerà la stessa sintassi per std::thread.

+1

IMHO Lo scopo delle librerie di concurrency Java è rendere più multi-threading più semplice del piano Java Threads (che si basa su pthreads) –

+0

@PeterLawrey Cosa c'è che non va con i pthreads? A meno che tu non stia parlando di raccolte concorrenti in Java, allora sì, quelle sono impossibili in pthreads. –

+1

@IgorGanapolsky non c'è niente di sbagliato in pthreads. Stavo considerando che confrontare Boost con i thread Java non equivale a confrontare Boost con java.util.concurrent che è stato aggiunto nel 2006 e questi sono molto più semplici. L'API di parallelStream() è di nuovo molto più semplice. –

1

Se si sta prendendo di mira una piattaforma specifica, la chiamata al SO diretto sarà probabilmente un po 'più veloce rispetto all'utilizzo di boost per C++. Tenderei a utilizzare ACE, poiché generalmente puoi effettuare le chiamate giuste per la tua piattaforma principale e sarà comunque indipendente dalla piattaforma. Java dovrebbe avere la stessa velocità fintanto che è possibile garantire che sia in esecuzione su una versione recente.

+2

Boost.thread è più veloce di ACE per il solo motivo che boost utilizza i template. Sia boost che ACE utilizzano le stesse chiamate del sistema operativo. Il codice compilato da Boost, tuttavia, è molto vicino a ciò che scriveresti usando i pthreads nativi. Mentre ACE deve eseguire la scansione attraverso gli strati di astrazione prima che tocchi primitive del sistema operativo nativo. Java avrebbe un problema simile ma la JVM è in grado di rimuovere la maggior parte (tutti?) Dei costi di astrazione. –

+0

Non dimenticare che ACE si concentra sulla comunicazione multipiattaforma e aggiunge molte astrazioni di livello superiore come il framework Reactor/Proactor. Quindi da quel punto di vista può essere preferito rispetto alla spinta. – count0

7

Per quanto riguarda le prestazioni, non mi preoccuperei molto. Ho la sensazione che un esperto di boost/C++ possa scrivere codice più veloce di un esperto di java. Ma tutti i vantaggi avrebbero dovuto lottare.

Preferisco i paradigmi di progettazione di Boost a Java. Java è completamente OO, dove Boost/C++ consente OO se lo desideri, ma utilizza il paradigma più utile per il problema in questione. In particolare amo RAII quando si tratta di serrature. Java gestisce in modo bello la gestione della memoria, ma a volte sembra che il resto delle risorse dei programmatori venga gestito: handle di file, mutex, DB, socket, ecc.

La libreria concomitante di Java è più estesa di quella di Boost. Pool di thread, contenitori simultanei, atomics, ecc. Ma i primitivi core sono alla pari tra loro, thread, mutex, variabili di condizione.

Quindi per le prestazioni direi che è un lavaggio. Se hai bisogno di un sacco di supporto per le librerie simultanee di alto livello, vince Java. Se preferisci la libertà paradigma C++.

12

java.util.concurrent e boost threads library hanno una funzionalità sovrapposta, ma java.util.concurrent fornisce anche a) le astrazioni di livello superiore eb) anche le funzioni di livello inferiore.

discussioni Boost forniscono:

java.util.concurrent ha inoltre:

Una nota a margine: il C++ non ha attualmente un modello di memoria. Su una macchina diversa la stessa applicazione C++ potrebbe dover gestire un diverso modello di memoria. Ciò rende la programmazione portatile e concorrente in C++ ancora più complicata.

0

In C++ si può usare direttamente pthreads (pthread_create() ecc.) Se si desidera. Internamente Java utilizza pthreads tramite il suo ambiente run-time. Fai "ldd" per vedere.

4

Se le prestazioni sono un problema nel programma multithread, è necessario prendere in considerazione un design privo di blocco.
Lock-free significa che i thread non competono per una risorsa condivisa e che minimizzano i costi di commutazione. In quel dipartimento, Java ha una storia migliore IMHO, con le sue collezioni concorrenti. È possibile trovare rapidamente una soluzione senza blocco.
Per aver usato la lib di Boost Thread un po '(ma non ampiamente), posso dire che il tuo pensiero sarà influenzato da ciò che è disponibile e ciò significa essenzialmente una soluzione di blocco.
Scrivere una soluzione C++ senza blocco è molto difficile, a causa della mancanza di supporto della libreria e anche concettualmente perché manca un modello di memoria che garantisce di poter scrivere oggetti veramente immutabili.

questo libro è un deve leggere: "Java è molto più veloce di quanto non fosse prima" Java Concurrency in Practice