Domanda

Come le librerie Boost discussione confrontare con le librerie java.util.concurrent?

Performance è critica e quindi preferirei rimanere con C ++ (anche se Java è molto più veloce in questi giorni). Dato che devo codice in C ++, quali librerie esistono per rendere threading errore facile e meno incline.

Ho sentito di recente che a partire dal JDK 1.5, il modello di memoria di Java è stato cambiato per correggere alcuni problemi di concorrenza. Che ne dite di C ++? L'ultima volta che ho fatto la programmazione multithread in C ++ è stato 3-4 anni fa, quando ho usato pthreads. Anche se, non voglio più utilizzare che per un grande progetto. L'unica altra alternativa che io conosca è Boost Fili. Tuttavia, non sono sicuro se è buono. Ho sentito parlare bene di java.util.concurrent, ma ancora nulla di discussioni Boost.

È stato utile?

Soluzione

discussioni Boost sono molto più facili da usare rispetto pthreads, e, a mio parere, un po 'più facile da usare rispetto thread Java. Quando un oggetto thread spinta viene istanziato, si lancia un nuovo thread. L'utente fornisce un oggetto funzione o una funzione che verrà eseguito in questo nuovo thread.

E 'davvero così 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 nella sua ultima versione di spinta, è possibile passare un numero variabile di argomenti al thread costruttore stesso, che verrà poi passato al gestore () del vostro oggetto funzione.

È inoltre possibile utilizzare le serrature RAII in stile con boost::mutex per la sincronizzazione.

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

Altri suggerimenti

amplificare le discussioni biblioteca avere una funzionalità di sovrapposizione, ma java.util.concurrent forniscono anche a) astrazioni di livello superiore e b) funzioni di livello anche inferiore.

discussioni Boost forniscono:

java.util.concurrent dispone inoltre di:

Una nota a margine: C ++ non appartiene a nessuno modello di memoria. Su una macchina diversa la stessa applicazione C ++ può avere a che fare con un modello di memoria diverso. Questo rende portatile, programmazione concorrente in C ++ ancora più difficile.

Performance saggio non vorrei davvero preoccuparsi. E 'la mia sensazione viscerale che una spinta / C ++ esperti potrebbe scrivere codice più veloce di un esperto di Java. Ma i vantaggi avrebbero dovuto combattuto per.

Io preferisco paradigmi di progettazione di spinta per Java. Java è OO tutta la strada, dove Boost / C ++ permette di OO, se ti piace, ma utilizza il paradigma più utile per il problema in questione. In particolare mi piace RAII quando si tratta con le serrature. Java si occupa della gestione della memoria in modo bello, ma a volte ci si sente come il resto delle risorse dei programmatori farsi scopare: handle di file, mutex, DB, prese, ecc

biblioteca concomitante di Java è più estesa di quanto Boost. pool di thread, contenitori concomitanti, atomiche, ecc Ma le primitive fondamentali sono alla pari con l'altro, fili, mutex, variabili di condizione.

Quindi, per le prestazioni direi che è un lavaggio. Se avete bisogno di un sacco di supporto alle librerie concomitante di alto livello Java vince. Se si preferisce paradigma ++ libertà C.

Se le prestazioni sono un problema nel vostro programma multithread, allora si dovrebbe prendere in considerazione un disegno senza blocchi.
Lock-libera discussioni mezzi non competono per una risorsa condivisa e che riduce al minimo i costi di commutazione. In quel reparto, Java ha una migliore IMHO storia, con le sue collezioni contemporanee. È rapidamente possibile trovare una soluzione priva di serratura.
Per aver usato il filo Boost lib un po '(ma non ampiamente), posso dire che il vostro pensiero sarà influenzato da ciò che è disponibile, e questo significa essenzialmente una soluzione di bloccaggio.
Scrivi C senza blocchi soluzione ++ è molto difficile, a causa della mancanza di sostegno biblioteca e anche concettualmente perché manca un modello di memoria che garantisce è possibile scrivere gli oggetti veramente immutabili.

questo libro è un deve leggere: Java Concurrency in Practice

Se ci si rivolge una piattaforma specifica, la chiamata diretta OS sarà probabilmente un po 'più veloce rispetto all'utilizzo di spinta per C ++. Vorrei tendo ad usare ACE, dal momento che si può generalmente fare le chiamate giuste per la propria piattaforma principale e sarà ancora indipendente dalla piattaforma. Java dovrebbe essere di circa la stessa velocità fino a quando si può garantire che si sarà in esecuzione su una versione recente.

In C ++ si può usare direttamente pthreads (pthread_create () ecc) se si voleva. Internamente Java utilizza pthreads attraverso il suo ambiente di run-time. Do "ldd" per vedere.

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